2015-06-07 55 views
2

我是新来的MultiThreading,我正在写一个应用程序,因为我有两个线程T1和T2。 在T1中,我有15条语句可以打印,T2我有15条语句可以打印。 我喜欢在T1执行语句5之后等待T2一段时间,然后在T1执行语句10之后继续T2。 我已经编写了代码,但T2并未等待,请任何人解释。如何使当前线程执行一些语句后等待一段时间

主题一:T1

public class ThreadOne extends Thread { 

public void run() { 



    for (int i = 1; i <= 15; i++) { 

     System.out.println("This is Thread One " + i); 

     if (i == 5) { 
      synchronized (Test.threadB) { 
       try { 
        Test.threadB.wait(); 
       } catch (InterruptedException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } else if (i == 10) { 
      synchronized (Test.threadB) { 
       Test.threadB.notify(); 
      } 
     } 


    } 


} 
} 

主题二:T2

public class ThreadTwo extends Thread { 

public void run() { 

    for (int i = 1; i <= 15; i++) { 

     System.out.println("This is Thread Two " + i); 
    } 


} 
} 

测试:

public class Test { 

static Thread threadA = null; 
static Thread threadB = null; 

public static void main(String[] args) throws InterruptedException { 

    threadA = new ThreadOne(); 
    threadB = new ThreadTwo(); 

    threadA.start(); 
    threadB.start(); 


} 
} 

我没有料到O/P:
后T1执行Test.threadB 。等待();当我是5时,不需要打印T2语句。在T1 i是10之后,T2可以开始打印。

但O/P我收到是:

This is Thread One 1 
This is Thread One 2 
This is Thread One 3 
This is Thread Two 1 
This is Thread Two 2 
This is Thread One 4 
This is Thread Two 3 
This is Thread One 5 
This is Thread Two 4 
This is Thread Two 5 
This is Thread Two 6 
This is Thread Two 7 
This is Thread Two 8 
This is Thread Two 9 
This is Thread Two 10 
This is Thread Two 11 
This is Thread Two 12 
This is Thread Two 13 
This is Thread Two 14 
This is Thread Two 15 
This is Thread One 6 
This is Thread One 7 
This is Thread One 8 
This is Thread One 9 
This is Thread One 10 
This is Thread One 11 
This is Thread One 12 
This is Thread One 13 
This is Thread One 14 
This is Thread One 15 

为什么只有T2 ststements是T1之后执行I == 5或(这是线程一个5被印刷)?请任何人解释。

+3

你觉得'Test.threadB.wait();'做什么,你为什么这么认为? –

+0

我想让T2等待,所以我打电话等待T2对象。在T1执行i == 10之后,我通知T2继续工作。 – user1936201

+2

_i想让T2等待_你为什么认为'Test.threadB.wait();'实现了这个? –

回答

-3

只需将您在ThreadOne中完成的操作复制到第二个。 线程是为了使程序的执行平行。

所以你不希望第二个线程等待,当你还没有给它任何等待逻辑。

你应该在线程一个使用线程两成锁和线程两个纱线一个作为锁:

+3

你能更准确地知道什么应该替换什么,最重要的是*为什么*? – Pshemo

+0

使用'Thread'对象作为锁对象是一个糟糕的主意。 –

3

我更喜欢使用类/接口从java.util.concurrent,而不是wait/notify,因为我相信它使代码更更易读/不易出现同步错误。你的情况,你可以使用被ThreadOneThreadTwo之间共享的暂停和恢复ThreadTwo一个Semaphore - 一个允许初始化信号,在每次迭代ThreadTwo电话availablePermits()如果有可用的许可证(返回值> 0),那么它前进,否则它会调用acquire()导致线程阻塞,直到许可证可用。 ThreadOne调用drainPermits()暂停ThreadTwo,然后调用release()以允许ThreadTwo恢复。

正如在评论中指出的Pshemo,它是落实,而不是延长ThreadRunnable很好的做法 - 这避免搞乱你的类,也可以让你集中使用ExecutorService线程。

Runnable runnableOne = // ... 
Runnable runnableTwo = // ... 
ExecutorService executor = Executors.newFixedThreadPool(2); 
executor.submit(runnableOne); 
executor.submit(runnableTwo); 
+1

这真是太棒了,但请以OP的问题来回答。 –

+0

同意答案,我也会使用ExecutorService/Callable组合。 – kervin

+0

@SotiriosDelimanolis我把这个问题看作是“我怎么得到这个行为,没有实施限制”,在这种情况下,我相信他会比'wait/notify'更好地学习java.util.concurrent。但是,如果实施有限制(例如,如果这是一项家庭作业,并且教授指定使用“wait/notify”),那么我将酌情编辑/删除我的答案。 –

相关问题