java - 在另一个线程中使用一个线程中生成的数据
问题描述
早上好,我的代码有问题我有一个线程根据按下的按钮生成一个数字,在另一个线程中我想检索这个值并通过一个方法发送它,但我无法恢复这个值它总是重置为零我可以在线程之间共享这个值吗
第一个线程生成数据值:
Thread coletaDados = new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
dados = avancaEE + sobe + desce + avancaED + recuaED + recuaEE;
// Log.i("Thread Dados", "Valor dos Dados" + dados);
Thread.sleep(100);
}
}catch (InterruptedException e) {
}
}
});
coletaDados.start();
public class ThreadEnvio extends Thread {
byte[] EnvioManual = new byte[10];
ChecksumSend checksumSend = new ChecksumSend();
private int Dados;
SerialPortManager spManager;
InseticidaManualFragment inseticidaManualFragment = new InseticidaManualFragment();
第二个线程使用数据值:
public ThreadEnvio()
{
// this.Dados = dados;
spManager = SerialPortManager.getInstances();
}
@Override
public void run() {
try {
while (true) {
Dados = inseticidaManualFragment.dados;
//Dados = inseticidaManualFragment.dados;
Log.d("Pressed", "dados" + Dados);
EnvioManual[0] = (0x04);
EnvioManual[1] = (0x10);
EnvioManual[2] = (0x00);
EnvioManual[3] = (0x00);
EnvioManual[4] = (byte) 0xff;
EnvioManual[5] = (0x00);
EnvioManual[6] = (0x02);
EnvioManual[7] = (byte) (Dados >> 8);
EnvioManual[8] = (byte) (Dados & 0xff);
EnvioManual[9] = checksumSend.Calculachecksum(EnvioManual);
send(EnvioManual);
// Log.d("Saida", "Enviando" + toHexString(EnvioManual));
Thread.sleep(100);
}
}
catch (InterruptedException e) {
}
}
public void send (byte[] x ){
spManager.send(SerialPortManager.ttyS0,true,":" + toHexString(x) + "\r\n");
}
public static String toHexString(byte[] bytes){
char[] hexArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] hexChars = new char[bytes.length*2];
int v;
for(int j=0;j<bytes.length;j++){
v = bytes[j] & 0xFF;
hexChars[j*2] = hexArray[v/16];
hexChars[j*2 + 1] = hexArray[v%16];
}
return new String(hexChars);
}
}
解决方案
我认为使用共享对象跨线程共享数据的最佳方式,其中一个线程将设置值,其他线程将检索。
这样,您可以对共享对象进行同步,以避免经典的读写器问题。
推荐阅读
- java - 如何在 JDBC 中建立一对多关系?
- spring-boot - 使用 Kotlin 对 Spring Boot 的 POST 请求中的问题
- azure-sql-database - 我们如何在 Azure SQL 数据仓库中修改表的列名?
- sql - SQL 禁用重复行 (Postgres)
- android - 如何从 url android 下载图像
- javascript - Javascript foreach背景颜色更改
- jsf - Primefaces 的内容安全策略默认设置限制 Bootsfaces 脚本
- git - 如何格式化 git diff 的输出
- python - 从带有混合分隔符的 pandas DataFrame 中挑选出值
- react-native - Redux 状态下的数组,React