2012-03-05 126 views
0

线程之间来回取整数值的正确方法是什么?如何将一个int值从一个线程发送到另一个线程?

我有两个线程运行run(){}函数。一个是接收/发送USB消息,另一个是运行游戏UI。他们都独立工作。使用来自USB的数据修改游戏的价值是问题领域。

我到目前为止尝试过的:我尝试创建一个名为container的全局对象,它包含一个public int变量并将其传递给两个线程进行通信,但运行时会使程序崩溃。

编辑:我可以将文件保存到SD卡,并让其他线程查看它吗?线程1需要写入SD卡,线程2需要读取它。没有必要进行双向通信。

编辑:如果有办法创建一个应用程序范围,全局变量的类型为int或包含一个int的应用程序范围的对象,这将工作。如果这样做,我想这样做。

+1

请提供您的代码和错误的堆栈跟踪 – christophmccann 2012-03-05 00:33:27

+0

@christophmccann:我该怎么做?我必须在通过USB连接到微控制器的手机上运行应用程序,但我无法同时通过USB连接到计算机。 – SwimBikeRun 2012-03-05 00:35:27

+0

至少提供你的代码然后... – christophmccann 2012-03-05 00:36:17

回答

3

您应该坚持使用Android线程模型。例如,请参阅this

UI线程是Android中的主线程。 如果你的UI线程不是主线程,你做错了什么。

从上面的链接,不要使用AsyncTask,因为你需要不止一次(我推测)修改UI的东西。拨打电话

myActivity.runOnUIThread(new Runnable() { 
    @Override 
    public void run() { 
     someUIelement.setValue(someIntReadFromUSB);  
    } 
} 

从您的线程读取USB。当你声明该Runnable时,你需要在范围中有someUIElementsomeIntReadFromUSB。如果它们是该范围内的局部变量,则必须确保它们是final变量。 (如果你必须申报整数最后,你可以声明一个新的最后一个变量对你定义了Runnable之前并复制你要发送到它的价值。)

2

使用AtomicInteger

+1

有没有必要的价值是AtomicInteger,这是非常足够的,如果地址值是4字节对齐! – 2012-03-05 00:40:51

+0

so原子整数是一种全局跨线程? – SwimBikeRun 2012-03-05 00:43:11

+0

@ user1018733如果您对两个线程均可用的AtomicInteger实例进行了引用,那么可以,两者都可以使用它并查看其他线程对其进行的更改(AtomicInteger提供必要的原子性和可见性保证)。 – 2012-03-05 00:46:19

0

“灿我将文件保存到SD卡,并让其他线程查看它?线程1需要写入SD卡,线程2需要读取它,不需要双向通信。“

我想你可以试一试java.util.concurrent.SynchronousQueue。

顺便说一句,我对Android一无所知,但在纯java这应该工作。