-1
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 
..

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

4

3 回答 3

1

Threads are not accurate in time. If they depend on each other, you have to manually synchronize, like : How to execute two threads Sequentially in a class

于 2013-05-07T13:22:08.850 回答
1

您可以通过使用计数器来实现此目的,如果计数器为 0,则线程 1 执行,递增计数器并在计数器上调用 notyfyAll(),如果计数器为 1,则线程 1 在计数器上调用 wait()。对于线程 2,反之亦然。

于 2013-05-07T13:28:43.993 回答
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() 等待两个线程完成,然后循环再次开始创建两个新线程。但请注意,创建线程可能是一项昂贵的操作,因此您应该只在线程在每次迭代中完成大量工作时才这样做,这样就没有太大关系了。

于 2013-05-07T13:33:54.693 回答