2013-11-21 69 views
3

我有一个线程可以从执行开始每秒打印经过时间,另一个线程每15秒打印一条消息。第一个线程应该更新线程之间共享的时间变量,并在每次更新时间变量时通知其他线程读取时间变量。这是我目前的:Java通知其他线程

public class PingPong implements Runnable 
{ 
    private static final int REPETITIONS = 4; 

String curName = ""; 
int currentTime = 0; 

Thread t1; 
Thread t2; 

PingPong() { 
    t1 = new Thread(this, "Admin"); 
    t1.start(); 

    t2 = new Thread(this, "Admin1"); 
    t2.start(); 

} 

public void run() { 
try { 
curName = Thread.currentThread().getName(); 

if(curName.equals(t1.getName())){ 
    for (int i=1; i<REPETITIONS; i++) { 
     System.out.println(Thread.currentThread().getName() + ": " + i); 
     Thread.sleep(1000); 
     // System.out.println(Thread.currentThread().getName() + ":" + Thread.currentThread().getState()); 
     System.out.println(t1.getName()); 
     currentTime++; 
    } 
} 
/*else if(curName == t2){ 
    System.out.println("Thread 2"); 
}*/ 
System.out.println(currentTime);  


} catch (InterruptedException e) {  
     return; // end this thread 
} 
} 

public static void main(String[] args) { 
    new PingPong(); 
} 
} 

我是非常新的线程,我不知道如果我正在实施我已经正确的。另外,我不知道如何通知另一个线程。我觉得我现在不在正确的道路上。

如果有人有任何帮助,它真的很感激!

+0

我的问题正确地得到你的问题,以及我从你的问题中了解到的是你需要'线程来沟通自己'。查看[Java并发](http://www.vogella.com/articles/JavaConcurrency/article.html)和[Java Callable](http://www.journaldev.com/1090/java-callable-future-example ) –

回答

1

尝试此代码:

class T1 extends Thread 
{ 
    private SharedClass s; 
    private int t; 
    T1 (SharedClass s) 
    { 
     this.s = s; 
    } 

    public void run() 
    { 
     while(true) { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     s.setSharedTime (++t); 
     System.out.println (t + " displayed by T1"); 
     } 
    } 
} 

class T2 extends Thread { 
    private SharedClass s; 

     T2 (SharedClass s) 
     { 
      this.s = s; 
     } 

     public void run() 
     { 
      while(true) { 
      int t; 
      t = s.getSharedTime(); 
      System.out.println (t + " displayed by T2 after 15 seconds."); 
      } 
     } 
} 

public class SharedClass { 
private int time; 
private boolean shareable = true; 

public static void main(String[] args) { 
    SharedClass s = new SharedClass(); 
    new T1 (s).start(); 
    new T2 (s).start(); 
} 
synchronized void setSharedTime (int c) 
{ 
    while (!shareable) 
     try 
     { 
     wait(); 
     } 
     catch (InterruptedException e) {} 

    this.time = c; 
    if(c%15==0) 
    shareable = false; 
    notify(); 
} 

synchronized int getSharedTime() 
{ 
    while (shareable) 
     try 
     { 
     wait(); 
     } 
     catch (InterruptedException e) { } 

    shareable = true; 
    notify(); 

    return time; 
} 
} 

在Java线程是轻量级进程和由单个CPU共享。而且java语句也需要一些时间来执行。该程序不能保证在15秒的时间间隔内运行,但大约需要15秒。