交替打印

题目:两个线程交替打印1到100.

使用wait(),notify(),notifyAll()

  1. public class 交替打印 {
  2. /**
  3. * 两个线程交替打印1-100
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. /*PrintNumber1 printNumber = new PrintNumber1();*/
  8. PrintNumber2 printNumber = new PrintNumber2();
  9. Thread t1 = new Thread(printNumber,"线程1");
  10. Thread t2 = new Thread(printNumber,"线程2");
  11. t1.start();
  12. t2.start();
  13. }
  14. /**
  15. * 使用类锁
  16. */
  17. static class PrintNumber1 implements Runnable{
  18. int i = 0;
  19. @Override
  20. public void run() {
  21. while (true){
  22. synchronized (this){
  23. notify();
  24. if(i<100){
  25. i++;
  26. System.out.println(Thread.currentThread().getName()+"--打印:"+i);
  27. }else {
  28. break;
  29. }
  30. try {
  31. wait();
  32. } catch (InterruptedException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }
  37. }
  38. }
  39. /**
  40. * 使用对象锁
  41. */
  42. static class PrintNumber2 implements Runnable{
  43. int i =0;
  44. private Object object = new Object();
  45. @Override
  46. public void run() {
  47. while (true){
  48. synchronized (object){
  49. object.notify();
  50. if(i<100){
  51. i++;
  52. System.out.println(Thread.currentThread().getName()+"--打印:"+i);
  53. }else {
  54. break;
  55. }
  56. try {
  57. object.wait();
  58. } catch (InterruptedException e) {
  59. e.printStackTrace();
  60. }
  61. }
  62. }
  63. }
  64. }
  65. }

注意wait(),notify(),notifyAll()三个方法的调用者必须是同步代码块或者同步方法中的同步监视器(锁),在上面的例子,同步代码块的锁为object对象,而现在notify和wait方法的调用者是this,即Number对象的实例,我们需要改成object去调用notify()和wait()方法即可。

参考资料