Java 交替打印两个线程的三儿种方法
Posted 一窝小猪仔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 交替打印两个线程的三儿种方法相关的知识,希望对你有一定的参考价值。
1 锁 + wait + notify
public class PrintTwoThreads
private static int i = 0;
private static final Integer mtx = 0;
private static final int MAX_PRINT_NUMBER = 9;
public static void main(String[] args)
new Thread(() ->
while(i <= MAX_PRINT_NUMBER)
synchronized (mtx)
if ((i & 1) == 1)
try
mtx.wait();
catch (InterruptedException e)
e.printStackTrace();
else
System.out.println("Thread1: " + i++);
mtx.notify();
).start();
new Thread(() ->
while(i <= MAX_PRINT_NUMBER)
synchronized (mtx)
if ((i & 1) == 0)
try
mtx.wait();
catch (InterruptedException e)
e.printStackTrace();
else
System.out.println("Thread2: " + i++);
mtx.notify();
).start();
2 Lock + Condition
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PrintTwoThreads
private static int i = 0;
private static final int MAX_PRINT_NUMBER = 9;
public static void main(String[] args)
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
new Thread(() ->
while(i <= MAX_PRINT_NUMBER)
try
lock.lock();
if ((i & 1) == 1)
condition.await();
else
System.out.println("Thread1: " + i++);
condition.signal();
catch (Exception e)
System.out.println(e);
finally
lock.unlock();
).start();
new Thread(() ->
while(i <= MAX_PRINT_NUMBER)
try
lock.lock();
if ((i & 1) == 0)
condition.await();
else
System.out.println("Thread2: " + i++);
condition.signal();
catch (Exception e)
System.out.println(e);
finally
lock.unlock();
).start();
3 volatile + 自旋锁
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PrintTwoThreads
private static volatile int i = 0;
private static final int MAX_PRINT_NUMBER = 9;
public static void main(String[] args)
new Thread(() ->
while (i <= MAX_PRINT_NUMBER)
if ((i & 1) == 0)
System.out.println("Thread1: " + i);
i++;
).start();
new Thread(() ->
while (i <= MAX_PRINT_NUMBER)
if ((i & 1) == 1)
System.out.println("Thread2: " + i);
i++;
).start();
以上是关于Java 交替打印两个线程的三儿种方法的主要内容,如果未能解决你的问题,请参考以下文章