线程更新以前创建的线程变量?

时间:2012-10-20 10:41:35

标签: java multithreading

我正在尝试做以下事情 -

  1. 创建一个主题
  2. 创建新线程时,它会更新上一个线程的变量limit
  3. 第三个线程的进度重复,即此线程更新线程ID1和ID2的变量limit
  4. 以下是一些示例代码

    主要类

    public class TaskImplementer {
        public static int End;
        public static int threadCount = 5;
    
        public static void main(String[] args) {
        int i=0;
    
        findEnd();
    
        while (i < threadCount) {
            if(isPossible()) {      // check for some condition
            createThread aThread = new createThread(i, End);
            aThread.start();
            }
            i++;
            //updateGUI();  //updateGUI - show working Threads
        }
        }
    
        private static void findEnd() {
        //updates End variable
        }
    
        private static boolean isPossible() {
        //.....
        //Check for a condition
        return false;
    
        }
    }
    

    createThread类

    public class createThread extends Thread {
        private static int ID;
        private static int limit;
        private static int startfromSomething;
    
        public createThread(int ThreadID, int End) {
        ID = ThreadID;
        limit = End;
        }
    
        private void doSomething() {
        //does work
        }
    
        @Override
        public void run() {
    
        while(startfromSomething < limit) {
            doSomething();
        }
        TaskImplementer.i--;
        }
    
    }
    

    成功创建时,每个线程都需要更新变量limit。有可能吗,请提出建议。提前谢谢。

3 个答案:

答案 0 :(得分:0)

我认为你应该在createThread类中包含原子整数,并且还应该通过列表保存可用的线程(createThread)对象,然后每次要运行另一个线程时,必须将其添加到列表中,同时减少或增加通过线程列表中的引用来限制其他正在运行的线程的变量,我的意思是你必须实现类似线程池的东西。

答案 1 :(得分:0)

根据您在步骤中给出的逻辑,您可以创建一个CreateThread数组并设置id和limit的参数。

public class TaskImplementer {
    static int End;
    static int threadCount = 5;

    public static void main(String[] args) {
        int i = 0;
        CreateThread[] tasks = new CreateThread[threadCount];
        while (i < threadCount) {
            int j = 0;
            while (j <= i) {

                if (tasks[j] != null) {
                    // Set ID and limit
                    tasks[j] = new CreateThread(j, End);
                    tasks[j].start();
                }
                j++;
            }
            i++;
        }
    }
}

答案 2 :(得分:0)

问题显然是由于您使用“静态”而不应该使用它! 这就是它应该是这样的:

public class CreateThread extends Thread {
   private int ID;
   private int limit;
   private static int startfromSomething; //Don't know about this one. If this value is the same for every thread, "static" is correct. Otherwise remove "static".

   public createThread(int ThreadID, int End) {
      ID = ThreadID;
      limit = End;
   }
}

如果要在此类的所有实例和静态内容之间共享字段,则使用“静态”。

还有一件事:Java代码约定要求你用大写字母开始你的类名。