要求:
实现一个容器,提供两个方法,add,count 写两个线程,线程1添加10个元素到容器中,线程2实 现监控元素的个数,当个数到5个时,线程2给出提示并结束。
首先创建一个T8类利用泛型集合将对象的使用标准化,并使用同步锁
volatile
关键字来保证可见性
final Object object = new Object();
volatile List<String> list = new ArrayList<>();
1.创建add()方法
得到线程的名称并输出
String t = Thread.currentThread().getName();
System.out.printf("%s 线程启动%n", t);
利用for循环线程1添加10个元素到容器中并使用同步锁
synchronized (object) {
for (int i = 0; i < 10; i++) {
}
}
在for循环输出的时候进行休眠一下,一个个出来
TimeUnit//时间工具类
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
然后进行格式化转换,并添加Item
String Iterm = String.format("Item-%02d", i + 1);
利用集合的list.add()方法添加进去并输出名称和添加内容
list.add(Iterm);
System.out.printf("%s : %s%n", Thread.currentThread().getName(), Iterm);
判断当当个数等于5的时候进行提示,然后A线程等待,并释放B线程(因为两个线程以一起启动,B线程必须先进行等待)
if (list.size() == 5) {
object.notifyAll();
object.wait();
然后会报中断异常,处理异常
try {
if (list.size() == 5) {
object.notifyAll();
object.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
然后输出A线程结束
System.out.printf("%s 线程结束%n", t);
void add()代码
void add() {
String t = Thread.currentThread().getName();
System.out.printf("%s 线程启动%n", t);
synchronized (object) {
for (int i = 0; i < 10; i++) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
//String Iterm = String.format("Item-%02d", i + 1);
//list.add(Iterm);
//System.out.printf("%s : %s%n", Thread.currentThread().getName(), Iterm);
try {
if (list.size() == 5) {
object.notifyAll();
object.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.printf("%s 线程结束%n", t);
}
2.编写count()方法
得到线程的名称并输出
String t = Thread.currentThread().getName();
System.out.printf("%s 线程启动%n", t);
判断当当个数不等于5的时候进行提示,
然后在锁中释放A线程,,B线程等待
并使用同步锁(确保原子性)
然后会报中断异常,处理异常
synchronized (object) {
if (list.size() != 5) {
try {
object.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
object.notifyAll();
}
然后输出B线程结束和个数到5时,统计获得元素个数
System.out.printf("%s 统计到5个元素%n", t);
System.out.printf("%s 线程结束%n", t);
void count()代码
void count() {
String t = Thread.currentThread().getName();
System.out.printf("%s 线程启动%n", t);
synchronized (object) {
if (list.size() != 5) {
try {
object.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
object.notifyAll();
}
System.out.printf("%s 统计到5个元素%n", t);
System.out.printf("%s 线程结束%n", t);
}
3.在main()方法中调用方法并启动线程
public static void main(String[] args) {
T8 t8 = new T8();//调用T8类中的方法
Thread A = new Thread(t8::add, "工作");//创建A线程
Thread B = new Thread(t8::count, "统计");//创建B线程
A.start();
B.start();
}