[英]How to run java threads sequentially on Android
我有七個聲納傳感器,我的目標是在Android平板電腦上順序顯示這些傳感器值。
為了在平板電腦屏幕上動態顯示傳感器值,我使用了Runnable
。
但是,如果聲納傳感器並行工作,則會引起聲納傳感器之間的干擾。 因此,我需要讓它們按順序工作。
我的問題是:是否可以按順序使用線程在Android平板電腦上顯示傳感器值?
雖然我使用了join()
和sleep()
,但傳感器仍然相互干擾。 當我嘗試使用wait和notify時,應用程序會給出內存不足的異常。 我也嘗試使用同步方法,但它並沒有影響它。
您可以在下面看到我的代碼。
package com.dinning;
import android.widget.TextView;
public class Dinning implements Runnable
{
public Interfacekit diningkit;
public TextView[] Rfidviews;
int count=1;
public Dinning(Interfacekit diningkit,Rfid drfid1,Rfid drfid2, Rfid drfid3,Rfid drfid4,Rfid drfid5,Rfid drfid6,Rfid fsrfid1,Rfid fsrfid2,Rfid fsrfid3,final TextView[] Rfidviews)
{
this.diningkit = diningkit;
this.Rfidviews = Rfidviews;
new Thread(this).start();
}
public void run()
{
while(count==1)
{
if(diningkit.getattach()==true)
{
Thread t1 = new Thread(new Runnable()
{
public void run()
{
Rfidviews[11].post(new Runnable()
{
public void run()
{
{
int sonar0 = diningkit.getsonar(7);
if(sonar0!=0)
Rfidviews[11].setText("Port0:"+sonar0);
else
Rfidviews[11].setText(" ");
}
}
});
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
Rfidviews[12].post(new Runnable()
{
public void run()
{
{
int sonar1 = diningkit.getsonar(6);
if(sonar1!=0)
Rfidviews[12].setText("Port1:"+sonar1);
else
Rfidviews[12].setText(" ");
}
}
});
}
});
Thread t3 = new Thread(new Runnable()
{
public void run()
{
Rfidviews[13].post(new Runnable()
{
public void run()
{
{
int sonar2 = diningkit.getsonar(5);
if(sonar2!=0)
fidviews[13].setText("Port2:"+sonar2);
else
Rfidviews[13].setText(" ");
}
}
});
}
});
t1.start();
t2.start();
t3.start();
}
}//while
}
}
package com.dinning;
import android.app.Activity;
import android.content.Context;
import com.phidgets.InterfaceKitPhidget;
import com.phidgets.Phidget;
import com.phidgets.PhidgetException;
import com.phidgets.event.AttachEvent;
import com.phidgets.event.AttachListener;
import com.phidgets.event.DetachEvent;
import com.phidgets.event.DetachListener;
import com.phidgets.event.InputChangeEvent;
import com.phidgets.event.InputChangeListener;
import com.phidgets.event.SensorChangeEvent;
import com.phidgets.event.SensorChangeListener;
public class Interfacekit {
int status=1;
InterfaceKitPhidget ik;
public boolean attach = false;
public Phidget phidget;
int value = 0;
int index = 0;
int serial;
int value0,value1,value2,value3,value4,value5,value6,value7,valport;
int sonarvalue0,sonarvalue1,sonarvalue2,sonarvalue3,sonarvalue4,sonarvalue5,sonarvalue6,sonarvalue7;
int curVal;
public Interfacekit(final Context con,final Activity act,int serial)
{
this.serial = serial;
try
{
com.phidgets.usb.Manager.Initialize(con);
ik = new InterfaceKitPhidget();
ik.addAttachListener(new AttachListener() {
public void attached(final AttachEvent ae)
{
act.runOnUiThread(new Runnable() {
public void run() {
try{
attach=true;
value0= ik.getSensorValue(0);
value1= ik.getSensorValue(1);
value2= ik.getSensorValue(2);
value3=ik.getSensorValue(3);
value4=ik.getSensorValue(4);
value5= ik.getSensorValue(5);
value6= ik.getSensorValue(6);
value7= ik.getSensorValue(7);
}catch(Exception e){}
}
});
}
});
ik.addDetachListener(new DetachListener() {
public void detached(final DetachEvent ae) {
attach = false;
phidget = ae.getSource();
act.runOnUiThread(new Runnable() {
public void run() {
}
});
}
});
ik.addSensorChangeListener(new SensorChangeListener() {
public void sensorChanged(SensorChangeEvent se) { //final Sensorchangeevent
value = se.getValue();
index = se.getIndex();
try {
sonarvalue0=ik.getSensorValue(0);
sonarvalue1=ik.getSensorValue(1);
sonarvalue2=ik.getSensorValue(2);
sonarvalue3=ik.getSensorValue(3);
sonarvalue4=ik.getSensorValue(4);
sonarvalue5=ik.getSensorValue(5);
sonarvalue6=ik.getSensorValue(6);
sonarvalue7=ik.getSensorValue(7);
} catch (PhidgetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
ik.addInputChangeListener(new InputChangeListener() {
public void inputChanged(final InputChangeEvent ie) {
}
});
ik.open(serial);
}
catch(Exception e){}
}
public boolean getattach()
{
return attach ;
}
/* Sonar*/
public int getsonar(int digitalOutput){
int curVal,result = 0;
if(5==digitalOutput){
try {
ik.setOutputState(digitalOutput, true);
}
catch (PhidgetException e) {
e.printStackTrace();
}
curVal=(int) (1.296*sonarvalue2);
if(curVal>0 && curVal<60){
result=curVal;
System.out.println("Port2: "+result);
}
else if (curVal>60)
result=0;
}
else if(6==digitalOutput){
try {
ik.setOutputState(digitalOutput, true);
}
catch (PhidgetException e) {
e.printStackTrace();
}
curVal=(int) (1.296*sonarvalue1);
if(curVal>0 && curVal<80)
result=curVal;
else if(curVal>80)
result=0;
}
else if(7==digitalOutput){
try {
ik.setOutputState(digitalOutput, true);
}
catch (PhidgetException e) {
e.printStackTrace();
}
curVal=(int) (1.296*sonarvalue0);
if(curVal>0 && curVal<50)
result=curVal;
else if(curVal>50)
result=0;
}
return result;
}
/* End Sonar*/
}
在java.util.concurrent包中使用ExecutorService。 特別是Executors.newSingleThreadExecutor();
newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor()創建一個Executor,它使用一個在無界隊列中運行的工作線程。 (但請注意,如果此單個線程由於在關閉之前執行期間的故障而終止,則在需要執行后續任務時將使用新的線程。) 保證任務按順序執行 ,並且不會有多個任務處於活動狀態在任何給定的時間。 與其他等效的newFixedThreadPool(1)不同,保證返回的執行程序不可重新配置以使用其他線程。
也
t1.start();
t1.join();
t2.start();
當另一個死亡時,啟動一個。 但是我根本不認為需要線程。 不必要的復雜化和他們的設計目的?
代替
Thread t1 = new Thread(new Runnable() {
public void run() {
//do something
}
});
它在一個線程中run()
方法。
嘗試
(new Runnable() {
public void run() {
//do something
}
}).run();
它創建匿名的Runnable
並直接調用其run()
(而不是通過Thread
),因此順序執行。
編輯0 :你似乎有很多Thread
s和Runnable
s沒有明確的理由。 我相信這段代碼應該是等價的,但是會簡化很多Thread
和Runnable
,這使得它難以閱讀:
package net.ukims.dsp.cid.dataaccess;
import android.widget.TextView;
public class Dinning implements Runnable {
public Interfacekit diningkit;
public TextView[] Rfidviews;
int count = 1;
public Dinning(Interfacekit diningkit, Rfid drfid1, Rfid drfid2,
Rfid drfid3, Rfid drfid4, Rfid drfid5, Rfid drfid6, Rfid fsrfid1,
Rfid fsrfid2, Rfid fsrfid3, final TextView[] Rfidviews) {
this.diningkit = diningkit;
this.Rfidviews = Rfidviews;
run();
}
public void run() {
while (count == 1) {
if (diningkit.getattach() == true) {
Rfidviews[11].post(new Runnable() {
public void run() {
{
int sonar0 = diningkit.getsonar(7);
if (sonar0 != 0)
Rfidviews[11].setText("Port0:" + sonar0);
else
Rfidviews[11].setText(" ");
}
}
});
Rfidviews[12].post(new Runnable() {
public void run() {
{
int sonar1 = diningkit.getsonar(6);
if (sonar1 != 0)
Rfidviews[12].setText("Port1:" + sonar1);
else
Rfidviews[12].setText(" ");
}
}
});
Rfidviews[13].post(new Runnable() {
public void run() {
{
int sonar2 = diningkit.getsonar(5);
if (sonar2 != 0)
fidviews[13].setText("Port2:" + sonar2);
else
Rfidviews[13].setText(" ");
}
}
});
}
}// while
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.