Java 如何将int值从一个线程发送到另一个线程?

Java 如何将int值从一个线程发送到另一个线程?,java,android,multithreading,Java,Android,Multithreading,在线程之间来回获取整数值的正确方法是什么 我有两个线程运行run(){}函数。一个正在接收/发送USB消息,另一个正在运行游戏UI。他们都独立工作。使用USB数据修改游戏的价值是问题所在 到目前为止我尝试过的是:我尝试创建一个名为container的全局对象,其中包含一个公共int变量,并将其传递给两个线程进行通信,但在运行时会使程序崩溃 编辑:我可以将文件保存到SD卡并让其他线程查看它吗?线程1需要写入SD卡,线程2需要读取SD卡。不需要双向通信 编辑:如果有一种方法可以创建int类型的应用程

在线程之间来回获取整数值的正确方法是什么

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

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

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


编辑:如果有一种方法可以创建int类型的应用程序范围的全局变量,或者包含int的应用程序范围的对象,那么这种方法就行了。如果这样做存在的话,我愿意这样做。

使用。

使用。

您可能应该坚持Android线程模型。例如,见

UI线程是Android中的主线程。如果您的UI线程不是主线程,则说明您做错了什么

从上面的链接来看,不要使用AsyncTask,因为您需要多次修改UI的东西(我猜)。打电话

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

从你读USB的线程。当您声明Runnable时,需要在作用域中包含
someUIElement
someIntReadFromUSB
。如果它们是该范围内的局部变量,则必须确保它们是
final
变量。(如果您必须声明integer final,您可以在定义Runnable之前声明一个新的final变量,并复制要发送给它的值。)

您可能应该坚持Android线程模型。例如,见

UI线程是Android中的主线程。如果您的UI线程不是主线程,则说明您做错了什么

从上面的链接来看,不要使用AsyncTask,因为您需要多次修改UI的东西(我猜)。打电话

myActivity.runOnUIThread(new Runnable() {
   @Override
   public void run() {
       someUIelement.setValue(someIntReadFromUSB);       
   }
}
从你读USB的线程。当您声明Runnable时,需要在作用域中包含
someUIElement
someIntReadFromUSB
。如果它们是该范围内的局部变量,则必须确保它们是
final
变量。(如果必须声明整数final,可以在定义Runnable之前声明一个新的final变量,并复制要发送给它的值。)

From

“我可以将文件保存到SD卡并让另一个线程查看它吗?线程1需要写入SD卡,线程2需要读取它。不需要双向通信。”

我想您可以试试java.util.concurrent.SynchronousQueue

顺便说一句,我对安卓一无所知,但在纯java中,这应该是可行的

“我可以将文件保存到SD卡并让另一个线程查看它吗?线程1需要写入SD卡,线程2需要读取它。不需要双向通信。”

我想您可以试试java.util.concurrent.SynchronousQueue



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

请提供您的代码以及error@christophmccann:我该怎么做?我必须在通过USB连接到微控制器的手机上运行应用程序,但我不能同时通过USB连接到计算机。至少提供您的代码……如果您的程序崩溃,请调试它。除非你有理由认为设计被破坏了,为什么要改变设计呢?全局变量是要避免的,在Java中更是如此。它们导致可读性和可维护性较差的代码。在线程之间传递数据是一种糟糕的方式。使用文件在线程之间传递值是“黑客行为”,效率非常低。请提供您的代码以及error@christophmccann:我该怎么做?我必须在通过USB连接到微控制器的手机上运行应用程序,但我不能同时通过USB连接到计算机。至少提供您的代码……如果您的程序崩溃,请调试它。除非你有理由认为设计被破坏了,为什么要改变设计呢?全局变量是要避免的,在Java中更是如此。它们导致可读性和可维护性较差的代码。在线程之间传递数据是一种糟糕的方式。使用一个文件在线程之间传递一个值是“黑客”式的,效率非常低。不需要这个值是AtomicInteger,如果值的地址是4字节对齐的就足够了@user1018733如果您对两个线程都可用的AtomicInteger实例进行引用,那么是的,两个线程都可以使用它并查看另一个线程对它所做的更改(AtomicInteger提供了必要的原子性和可见性保证)。@AdamZalcman-Nice。我将如何在两个线程中声明它?只要名称相同,编译器就会将两个“局部变量”的地址链接成一个全局变量?将公共原子整数myglobalint;在这两个文件中?@user1018733:如果您只使用单个读取器,则不需要原子值,因为我使用了4字节地址值aligment就足够了。@user1018733 Java中没有全局变量。您正在使用两个可运行实例吗?如果是这样,请在启动线程之前创建一个AtomicInteger,并将引用传递给两个可运行程序。不需要该值是AtomicInteger,如果值的地址是4字节对齐的就足够了@user1018733如果您对两个线程都可用的AtomicInteger实例进行引用,那么是的,两个线程都可以使用它并查看另一个线程对它所做的更改(AtomicInteger提供了必要的原子性和可见性保证)。@AdamZalcman-Nice。我将如何在两个线程中声明它?只要名称相同,编译器就会将两个“局部变量”的地址链接成一个全局变量?P