【问题标题】:Using two threads and controlling one from the other in java?在java中使用两个线程并控制另一个线程?
【发布时间】:2010-12-26 02:20:35
【问题描述】:

谁能帮帮我。
我需要使用两个线程,一个线程将永久运行 while(true) 并跟踪定位指针(一些随机值以方法形式出现)。这个线程有一个逻辑,如果值等于某个值,它应该启动新线程。如果值不相等,它应该停止另一个线程。

谁能给我一些关于如何实现这一点的代码 sn-p(块级)?

【问题讨论】:

  • 能否请您修改您的问题并添加: 1)您的代码目的概述(帮助我们更好地理解问题); 2)当值等于某个值时,您将启动一个新线程。这个新线程有什么作用?当值不相等时,是否需要停止这个新启动的线程?谢谢
  • rodion,实际上我只是对一件基本的事情感到困惑。要运行多个线程,我使用不同的类来完成此任务,这就是导致问题的原因。如果我使用同一个类,有两个线程,两者共享相同的朗姆酒方法?我想如何为每个线程运行不同的代码。
  • 你还没有回答rodion的问题。这一切的目的是什么?您的非程序化要求是什么?你有什么代码?
  • 你让我在这里迷路了。至于如何为每个线程运行不同代码的问题,答案是:使用不同的类(实现Runnable 或扩展Thread)。确保按照@Sara 的建议运行它们(参见main 方法),否则它们将不会在单独的线程中运行。

标签: java multithreading


【解决方案1】:

创建一个实现 Runnable 的类。在那里你将创建一个 run() 方法。

喜欢:

public class StackOverflow implements Runnable{

private Thread t = null;

public void run(){
}

public void setAnotherThread(Thread t){
 this.t = t;
}


}

在主类上,您将基于您创建的其他类创建 2 个 Thread 实例。

StackOverflow so1 = new StackOverflow();
StackOverflow so2 = new StackOverflow();
Thread t1 = new Thread(so1);
Thread t2 = new Thread(so2)

然后你将一个线程设置在另一个线程中,这样你就可以控制它了。

t1.setAnotherThread(so2);
t2.setAnotherThread(so1);

然后你做你需要做的。

【讨论】:

    【解决方案2】:

    好吧,如果我没记错的话,您希望有一个可以作为“线程”或(我们称之为)“子线程”运行的类。 但是如何使用一种运行方法来做到这一点?只需声明一个布尔变量,指定线程对象是子线程还是父线程,并相应地声明两个构造函数,一个创建父线程,另一个创建子线程,并且能够停止子线程-thread 声明另一个名为 stop 的变量,默认为 false。

    class ThreadExample extends Thread {
    
    private boolean sub = false;
    private ThreadExample subThread = null;
    public boolean stop = false;
    public ThreadExample() {
    }
    
    public ThreadExample(boolean sub) {
        this.sub = sub;
    }
    
    public void run() {
        if (sub) {
            runSubMethod();
        } else {
            runParentMethod();
        }
    }
    
    public void runParentMethod() {
        boolean running = true;
        while (running) {
            if (getRandomValue() == some_other_value) {
                if (getSubThread().isAlive()) {
                    continue;
                }
                getSubThread().start();
            } else {
                getSubThread().makeStop();
            }
        }
    }
    
    public void runSubMethod(){
    
        while(true){
            //do stuff
            if (stop)
                break;
    
        }
    }
    
    public int getRandomValue() {
        //your "Random Value"
        return 0;
    }
    
    private ThreadExample getSubThread() {
        if (subThread == null) {
            subThread = new ThreadExample(true);
        }
        return subThread;
    }
    public void makeStop(){
        stop = true;
    }
    

    }

    【讨论】:

      【解决方案3】:

      这是一个简单的想法,您可以在一个类中实现任意数量的线程:

      class MultipleThreads{  
      
         Runnable r1 = new Runnable() {
           public void run() {
             ... code to be executed ...
           }
         };
      
         //-----
      
         Runnable r2 = new Runnable() {
           public void run() {
             ... code to be executed ...
           }
         };
      
         //--- continue as much you like  
      
         public static void main (String[] args){  
      
            Thread thr1 = new Thread(r1);
            Thread thr2 = new Thread(r2);
            thr1.start();
            thr2.start();
         }  
      }
      

      希望对你有帮助!!
      对于两个线程之间的通信,一个简单的解决方案是设置一个布尔类型的 volatile 静态变量,并从一个线程设置它,并将其置于另一个线程中的while(flag) 条件。
      您可以使用此方法控制其他线程。
      如果你有等待进程或 Thread.sleep() 并且你想中断线程而不让它完成它,你会通过捕获异常来中断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-26
        相关资源
        最近更新 更多