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