如何在运行方法线程(Java)中获取类变量

时间:2013-10-24 00:54:40

标签: java multithreading

我的问题关注线程。我想从方法运行中得到var(类变量),但不能得到和 我不知道发生了什么。

import java.util.ArrayList;

public class Interpreter_controller extends Thread{
    ArrayList<String> var;


    public Interpreter_controller(ArrayList<String> var) {
        this.var = var;
        System.out.println(this.var.isEmpty());
    }

    public void run() {
        System.out.println(this.var.isEmpty());
    }
}

当我从

开始线程时
Interpreter_controller control = new Interpreter_controller(array_list_variable);
control.start();

输出

如何从run方法中获取var?

新编辑

我删除了扩展线程然后结果是正确的但我想在这个类中使用线程

我的目标是从另一个类传递arraylist以在线程类(run方法)中使用

2 个答案:

答案 0 :(得分:0)

  

我的目标是从另一个类传递arraylist以在线程中使用   class(run method)

看看这个:

class Tmp implements Runnable {

  public Object runArg;

  public Tmp(Object arg) {
      runArg = arg;
  }

  public void run() {
      // thread job
  }
}

使用:

new Thread(new Tmp("Hello World")).start();

所以你必须创建一个新类而不是使用匿名类。

注意:除非您使用的是J2ME,否则不应使用原生Thread。你会遇到很多问题。您应该使用ExecutorService类来使用Executors

private final ExecutorService pool = Executors.newCashedThreadPool();

...

pool.submit(new Tmp("HelloWorld"));

答案 1 :(得分:0)

您好以下将为您提供先机。确保列表已同步。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Main {

    public static void main(String[] args) throws InterruptedException {
        Main m = new Main();
        m.execute();
    }

    public void execute() throws InterruptedException {
        List<String> list = new ArrayList<String>();
        list = Collections.synchronizedList(list);
        List<Thread> tlist = new ArrayList<Thread>();
        for (int i = 0; i < 5; i++) {
            Thread t = new SomeThread(list, i);
            t.start();
            tlist.add(t);
        }

        while (true) {
            int j = 0;
            for (int i = 0; i < tlist.size(); i++) {
                Thread.sleep(100);
                if (!tlist.get(i).isAlive()) {
                    j++;
                    for (String s : list) {
                        System.out.println(s);
                    }
                }
            }
            if (j == tlist.size()) {
                break;
            }
        }
    }

    public class SomeThread extends Thread {

        private List<String> list;
        private int number;
        private long sleepTime;

        public SomeThread(List list, int number) {
            this.list = list;
            this.number = number;
            sleepTime = new Random(number).nextInt(500);

        }

        @Override
        public void run() {
            try {
                Thread.sleep(sleepTime);
                list.add(number + " wake up from sleep");
            } catch (InterruptedException e) {
                System.out.println(e);
            }

        }

    }

}