两个线程交替打印字符串
每个对象都有一内置锁
wait方法 释放对象锁(不占对象锁)
sleep方法不释放对象锁(占对象锁)
优秀写法(下面写法可能有问题,synchronized (LOCK)提到 while前面就好了)
1 class Info { 2String printStr = "i think this is ok"; 3int i = 0; 4 5public void print() { 6if (i < printStr.length()) { 7System.out.println(Thread.currentThread().getName() + "print" 8+ printStr.charAt(i)); 9i++; 10} 11} 12 } 13 14 public class main { 15private static Object LOCK = new Object(); 16static Info info = new Info(); // 互斥资源 17static boolean flag = false; // false for a ,true for b 18 19public static void main(String[] args) { 20// 两个线程 交替打印字符串 21Thread a = new Thread() { 22public void run() { 23while (info.i < info.printStr.length()) 24synchronized (LOCK) { 25{ 26if (false == flag) { 27try { 28LOCK.wait(); // 在wait后的瞬间线程b得到锁 29} catch (InterruptedException e) { 30e.printStackTrace(); 31} 32} 33flag = false; 34info.print(); 35LOCK.notify(); // 在这里虽然唤醒了另一个线程b,但锁并没有释放 36} 37} 38}; 39}; 40Thread b = new Thread() { 41public void run() { 42while (info.i < info.printStr.length()) 43synchronized (LOCK) { 44{ 45if (true == flag) { 46try { 47LOCK.wait(); // 在wait后的瞬间线程b得到锁 48} catch (InterruptedException e) { 49e.printStackTrace(); 50} 51} 52flag = true; 53info.print(); 54LOCK.notify(); // 在这里虽然唤醒了另一个线程b,但锁并没有释放 55} 56} 57}; 58}; 59a.start(); 60b.start(); 61} 62 63 }
代码1
1 package ThreadTest; 2 3 4 class Info 5 { 6String printStr="i think this is ok"; 7int i=0; 8boolean flag=false; 9publicvoid print1() 10{ 11synchronized(this) 12{ 13if(flag==false) 14{ 15try { 16this.wait(); 17} catch (InterruptedException e) { 18e.printStackTrace(); 19} 20} 21realprint(); 22flag=false; 23notify(); 24} 25} 26publicvoid print2() 27{ 28synchronized(this) 29{ 30if(flag==true) 31{ 32try { 33this.wait(); 34} catch (InterruptedException e) { 35e.printStackTrace(); 36} 37} 38realprint(); 39flag=true; 40notify(); 41} 42} 43public void realprint() 44{ 45if(i
代码2
1 package MyThreadMethod; 2 3 import java.util.concurrent.locks.Condition; 4 import java.util.concurrent.locks.ReentrantLock; 5 6 class Info 7 { 8String printStr="i think this is ok"; 9int i=0; 10publicvoid print1() 11{ 12if(i
3 不同写法
1 class Info 2 { 3String printStr="i think this is ok"; 4int i=0; 5public void print() 6{ 7if(i
【两个线程交替打印字符串】转载于:https://www.cnblogs.com/friends-wf/p/3658258.html
推荐阅读
- Linux下面如何查看tomcat已经使用多少线程
- 刘婵为何不娶关羽的女儿为妻子,而为何要娶张飞的两个女儿
- 多线程NSOperation
- 说睡
- 有人与我谈格局
- ||11|2019年9月9日
- 活的教导7:两个阶段
- 两个人在一起,最怕将就。
- spring|spring boot中设置异步请求默认使用的线程池
- 两个心得