1.每个线程打印不同的字符
public class ThreadPrint
{
public static void main(String[] args)
throws InterruptedException
{
String str = "ABCD";
int index = 4;
Character c;
Map locks = new HashMap<>();
MyLock lock = new MyLock();
for (int i = 0;
i < index;
i++)
{
for (int j = 0;
j < str.length();
j++)
{
c = str.charAt(j);
if (null == locks.get(c))
{
lock = new MyLock();
lock.setCountDownLatch(new CountDownLatch(1));
new Thread(new MyRunnable(c, lock)).start();
locks.put(c, lock);
lock.getCountDownLatch().await();
}
else
{
lock = locks.get(c);
lock.setCountDownLatch(new CountDownLatch(1));
synchronized (lock)
{
locks.get(c).notify();
}
lock.getCountDownLatch().await();
}
}
}
for (Entry entry : locks.entrySet())
{
synchronized (entry.getValue())
{
entry.getValue().setEnd(true);
entry.getValue().notify();
}
}
}static class MyLock
{
private boolean end = false;
private CountDownLatch countDownLatch;
public CountDownLatch getCountDownLatch()
{
return countDownLatch;
}public void setCountDownLatch(CountDownLatch countDownLatch)
{
this.countDownLatch = countDownLatch;
}public boolean isEnd()
{
return end;
}public void setEnd(boolean end)
{
this.end = end;
}
}static class MyRunnable implements Runnable
{private char c;
private MyLock lock;
public MyRunnable(char c, MyLock lock)
{
this.c = c;
this.lock = lock;
}@Override
public void run()
{
synchronized (lock)
{
while (!lock.isEnd())
{
System.out.print(c);
lock.getCountDownLatch().countDown();
try
{
lock.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}public char getC()
{
return c;
}public void setC(char c)
{
this.c = c;
}}
}
【两道多线程打印题目】2.两个线程交替打印一段字符串
public class PrintWithTwoThread
{
static int i = 0;
public static void main(String[] args)
{
String str = "I'am hahaha";
new Thread(() -> {
synchronized (str)
{
while (i < str.length())
{
System.out.println(Thread.currentThread().getName() + ":" + str.charAt(i));
i++;
try
{
str.notify();
str.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
str.notify();
}
}, "1").start();
new Thread(() -> {
synchronized (str)
{
while (i < str.length())
{
System.out.println(Thread.currentThread().getName() + ":" + str.charAt(i));
i++;
try
{
str.notify();
str.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
str.notify();
}
}, "2").start();
}}
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)