使用Thread.run()在Enhanced循环中同时执行两个线程

时间:2013-05-07 13:18:51

标签: java multithreading

public abstract class Multithread implements Runnable{
    static Thread t1 = new Thread(){
        public  synchronized void run(){
            try {
                for(;;){
                    System.out.println("java");
                    t1.sleep(300);
                }
            } catch (Exception e) {
                System.out.println("Exception"+e);
            }
        }
    };
    static Thread t2 = new Thread(){
        public  synchronized void  run(){
            try{
                for(;;){
                    System.out.println("world");
                    t2.sleep(300);
                }
            }catch(Exception e){
                System.out.println("Exception"+e);
            }
        }
    };
    public static void main(String[] args) {
        try{
            t1.start();
            t2.start();
        }catch(Exception e){
            System.out.println("Exception "+e);
        }
    }
    @Override
    public void run() {
        System.out.println("running");
    }
}

例外O / P:

java
world
java
world
java
world
.
.
.
.

观察 我尝试使用sleep()作为线程,它们会在某个时间点重叠 -

java
java
world
java
world
world 
java 
..

预期 我需要这两个线程并行运行,它不应该重叠,任何一个线程都可以启动。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

线程不准确。如果他们彼此依赖,则必须手动同步,例如:How to execute two threads Sequentially in a class

答案 1 :(得分:1)

你可以通过一个计数器实现这一点,如果计数器是0线程1执行,增加计数器并调用计数器上的notyfyAll(),如果计数器是1线程,则在计数器上调用wait()。反之亦然,线程2。

答案 2 :(得分:0)

当您并行执行两个线程时,每个线程都由底层操作系统独立执行。任务调度程序可以决定何时执行哪个线程。这可能会导致您遇到的时间分布不均匀。

对此的一个解决方案是使用共享Semaphore来锁定每个线程,直到另一个线程完成其任务。然后每个线程将获取两个信号量,一个用于自身,另一个用于另一个线程。两个信号量都以一个许可开始,因此第一个release()调用不会阻止。然后线程会像那样工作(psudocode):

for (;;) {
    otherThreadSemaphore.acquire(); // blocks until the other thread called release()
    performWork();
    ownThreadSemaphore.release(); // allows the other thread to perform another iteration
}

另一种方法是将无限循环移出线程。在循环的每次迭代中,您生成两个线程,然后使用thread.yield()等待两个线程完成,然后循环再次开始创建两个新线程。但请注意,创建线程可能是一项昂贵的操作,因此只有当线程在每次迭代中执行大量工作时才应执行此操作,这样做无关紧要。