我已经从我的父线程(主/UI 线程)启动了一个子线程。从这个子线程我开始另一个线程(孙子?)。现在我希望能够将一个字符串从我的主线程传递给我的孙线程,这样我就可以使用这个字符串在孙线程中调用一个方法。
由于我是 Java 和线程新手,这让我很困惑。我已经查看了消息处理程序等,但不知道这是否可行,因为我找不到我理解的示例。
我已经从我的父线程(主/UI 线程)启动了一个子线程。从这个子线程我开始另一个线程(孙子?)。现在我希望能够将一个字符串从我的主线程传递给我的孙线程,这样我就可以使用这个字符串在孙线程中调用一个方法。
由于我是 Java 和线程新手,这让我很困惑。我已经查看了消息处理程序等,但不知道这是否可行,因为我找不到我理解的示例。
通常我们不会也不能在java中的线程之间传递值。我们在线程之间共享值和对象。线程之间共享和传递值之间存在非常细微的差异。如果您以某种方式将值传递给线程,那么该线程将对其拥有独占权,即线程将拥有自己的值副本,我们无需担心该变量的不同步代码或线程安全。我们通常在使用消息传递的并发系统中使用这种类型的概念。请参阅:https ://en.wikipedia.org/wiki/Message_passing
但是在 Java 中,我们通常在多个线程之间共享值。并且线程之间没有关系,即没有子线程或大子线程。只有守护线程和非守护线程(http://www.javaworld.com/jw-04-1996/jw-04-threads.html)。因此,如果您必须在孙子线程和主线程之间共享一些价值。您必须制作一个可用/共享的对象。请看下面的例子:
public class GranDChildThread {
/**
* Please note there are no relation ships among thread.
* Simply put, a thread is a program's path of execution.
* All the three threads have access to shared String
*/
public static String sharedString = new String("its a wonderfull life");
public static void main(String[] args) {
// this is my main Thread
System.out.println("Main Thread: I have access to
sharedString : " + sharedString);
Thread childThread = new Thread(new Runnable() {
@Override
public void run() {
// this is child thread
System.out.println("Child Thread:
I have access to sharedString : " + sharedString);
Thread grandChildThread = new Thread(new Runnable() {
@Override
public void run() {
// this grand Child
System.out.println("Grand Child Thread:
I have access to sharedString : " + sharedString);
}
});
}
});
}
}
这是最简单的例子。使用 setter 和 getter 可以派上用场。
import android.os.Bundle;
import android.util.Log;
public class MyExtendedThread extends Thread{
private String mData;
public MyExtendedThread(String dataStringIwantToPass){
this.mData = dataStringIwantToPass;
}
@Override
public void run() {
//DO SOMETHING WITH mData
//for example:
while(true){
if(mData != null)
Log.i("mData: ", mData);
Thread.sleep(2000);//sleep it few seconds :)
}
}
public String getData() {
return mData;
}
public void setData(String mData) {
this.mData = mData; //you might want to change the value at some point of time
}
}
在这里,我们将 Thread 类继承到我们的自定义类,该类将具有 setter 和 getter 以及带参数的构造函数。这很简单。我们将使用 setter 随时更改字符串的值。
@Override
public void onCreate(Bundle savedInstanceState ) {
final String data = "this is string";
Thread theThreadStartedFromUIthread = new Thread(new Runnable(){
MyExtendedThread myOtherThread = new MyExtendedThread(data);
@Override
public void run() {
// Do some stuff
myOtherThread.start();// the other (grandchild) thread has started
//here i want to change the value of mData, assuming the thread is still running
myOtherThread.setData("Alright, I've changed you.");
}});
};
}
有帮助吗?