简单的线程实例如下
package mythread;
public class Mythread extends Thread{
private String value1;
public void run(){
value1 = "str1";
}
}
例如我在另外一个swt界面程序,点击一下button,怎么获取前面线程的value1的值?
public void mouseDown(MouseEvent e) {
MyThread thread = new MyThread();
thread.start();
System.out.println("value1:"+thread.value1); //获取不到value1值
}
这样获取不到value1的值。。
这个应该不是定义变量的问题,应该是因为多线程的问题,在主线程打印thread对象中value1变量的时候,在子线程thread1中还没有执行run方法给value1进行赋值,
应该是这个问题。
有几种解决方案:
1. 让主线程睡眠一小会Thread.sleep(500)
2. 让子线程先执行,等子线程执行完再继续执行主线程(推荐)
public void mouseDown(MouseEvent e) {
MyThread thread = new MyThread();
thread.start();
thread.join(); // 加入这一行
System.out.println("value1:"+thread.value1);
}
3.使用wait()和notify() 来等待和唤醒线程
定义一个全局变量就可以哒。
你的value1定义是private,改为public或者提供一个get方法。
package mythread;
public class Mythread extends Thread{
private String value1;
public void run(){
value1 = "str1";
}
//增加一个get方法
public String getVaule(){
return value1;
}
}
public void mouseDown(MouseEvent e) {
MyThread thread = new MyThread();
thread.start();
System.out.println("value1:"+thread.getVaule());
}
1、在数据库里建临时表,线程这边存,用的地方查
2、使用redis缓存,线程这边以键值对的形式存,用的地方用key取;
原因:
1. 工作线程Mythread
不能直接更新界面。
2. 工作线程Mythread
执行可能在主线程下一行代码执行之前或之后,所以thread.getValue()可能会没值,因为多线程还没执行赋值操作。
解决办法:
1. SWT界面里用以下执行多线程并更新界面.
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
Button butt = new Button(panel,SWT.PUSH);
butt.setText("Push");
}
});
用callable实现吧?必须Thread吗?