有关多线程的手撕代码
1.使用多线程循环输出ABCD
1.1.通过自旋暴力实现
通过线程池(规范禁止显示的创建线程)以及加锁来实现循环输出ABCD。
public class 循环输出ABCD {
//使用java方法获得电脑核心数,用来设置线程池
static final int core=Runtime.getRuntime().availableProcessors();
//图方便使用了Fixed方法创建,规范推荐使用ThreadPoolExecutor创建线程池
private static ExecutorService executors = Executors.newFixedThreadPool(core);
//输出次数
private static volatile int times=40;
public static void main(String[] args) {
//每次操作加锁,防止多线程死锁程序卡死
final Lock lock= new ReentrantLock();
executors.execute(()->{
//使用while来循环判断,类似自旋,同时避免虚假唤醒
while (times>0){
lock.lock();
//用times判断保证0次退出
if (times%4==0&×>0){
System.out.print("A");
times--;
}
lock.unlock();
}
});
executors.execute(()->{
while (times>0){
lock.lock();
if (times%4==3&×>0){
System.out.print("B");
times--;
}
lock.unlock();
}
});
executors.execute(()->{
while (times>0){
lock.lock();
if (times%4==2&×>0){
System.out.print("C");
times--;
}
lock.unlock();
}
});
executors.execute(()->{
while (times>0){
lock.lock();
if (times%4==1&×>0){
System.out.println("D");
times--;
}
lock.unlock();
}
});
//最后关闭线程池
executors.shutdown();
}
}
运行结果:
1.2.通过Condition有序执行
public class 循环有序输出ABCD {
//状态量
private static int state = 1;
private static final int core = Runtime.getRuntime().availableProcessors();
//创建一个线程池
private static ExecutorService executor=Executors.newFixedThreadPool(core);
public static void main(String[] args) {
Lock lock = new ReentrantLock();
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
Condition condition4 = lock.newCondition