未知昵称
2019-10-09 15:47
采纳率: 89.7%
浏览 496
已采纳

java创建Thread线程,里面的值怎么返回让其他程序读取?

简单的线程实例如下

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的值。。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • 唐宋xy 2019-10-09 16:46
    已采纳

    这个应该不是定义变量的问题,应该是因为多线程的问题,在主线程打印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() 来等待和唤醒线程

    已采纳该答案
    打赏 评论
  • Lagelanren 2019-10-09 16:01

    定义一个全局变量就可以哒。

    打赏 评论
  • VICTOR_fusheng 2019-10-09 16:20

    你的value1定义是private,改为public或者提供一个get方法。

    打赏 评论
  • 空白如空 2019-10-09 16:44
    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());
    }   
    
    打赏 评论
  • ZS12345678ZS 2019-10-09 17:24

    1、在数据库里建临时表,线程这边存,用的地方查
    2、使用redis缓存,线程这边以键值对的形式存,用的地方用key取;

    打赏 评论
  • infoworld 2019-10-09 17:32

    原因:
    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");
     }
    }); 
    
    打赏 评论
  • 会灰翔的灰机 2019-10-10 15:48

    用callable实现吧?必须Thread吗?

    打赏 评论

相关推荐 更多相似问题