0

我的问题关注线程。我想从方法运行中获取 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以在线程类中使用(运行方法)

4

2 回答 2

0

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

看看这个:

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,否则不应使用 native Thread。你会遇到很多问题。您应该ExecutorService通过使用Executors类来使用:

private final ExecutorService pool = Executors.newCashedThreadPool();

...

pool.submit(new Tmp("HelloWorld"));
于 2013-10-24T01:34:57.090 回答
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);
            }

        }

    }

}
于 2013-10-24T01:39:21.253 回答