多线程编程步骤
第一步 创建资源类,在资源类中创建属性和操作方法
第二步 在资源类中操作方法
(1)判断 一般用while
(2) 干活
(3) 通知
第三步 创建多个线程,调用资源类的操作方法
1.线程通讯
两个线程,一个线程执行+1 另一个线程执行-1
使用synchronized
public class DataOperate {
private int number=0;
public synchronized void increase() throws InterruptedException {
while(number!=0) {
this.wait();//wait在哪里睡就在哪里醒
}
number++;
System.out.println(Thread.currentThread().getName()+"\t"+number);
this.notifyAll();
}
public synchronized void decrease() throws InterruptedException {
while(number!=1) {
this.wait();
}
number--;
System.out.println(Thread.currentThread().getName()+"\t"+number);
this.notifyAll();
}
}
使用Lock
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class DateOperateLock {
private int num=0;
private ReentrantLock lock=new ReentrantLock();
private Condition condition=lock.newCondition();
public void incr() throws InterruptedException {
lock.lock();
try {
while(num!=0) {
condition.await();
}
num++;
System.out.println(Thread.currentThread().getName()+"\t"+num);
condition.signalAll();
}
finally{
lock.unlock();
}
}
public void decr() throws InterruptedException {
lock.lock();
try {
while(num!=1) {
condition.await();
}
num--;
System.out.println(Thread.currentThread().getName()+"\t"+num);
condition.signalAll();
}
finally{
lock.unlock();
}
}
}
2.线程定制化通讯
三个线程交替顺序打印内容
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
class ShareResource{
private int flag=1;//aa 1 bb 2 cc 3
private ReentrantLock lock=new ReentrantLock();
private Condition conditionA=lock.newCondition();
private Condition conditionB=lock.newCondition();
private Condition conditionC=lock.newCondition();
public void print5(int loop) throws InterruptedException {
try {
lock.lock();
while(flag!=1) {
conditionA.await();
}
for(int i=0;i<5;i++) {
System.out.println(Thread.currentThread().getName()+" \t"+i+" \t"+loop);
}
flag=2;
conditionB.signal();
}finally {
lock.unlock();
}
}
public void print10(int loop) throws InterruptedException {
try {
lock.lock();
while(flag!=2) {
conditionB.await();
}
for(int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName()+" \t"+i+" \t"+loop);
}
flag=3;
conditionC.signal();
}finally {
lock.unlock();
}
}
public void print15(int loop) throws InterruptedException {
try {
lock.lock();
while(flag!=3) {
conditionC.await();
}
for(int i=0;i<15;i++) {
System.out.println(Thread.currentThread().getName()+" \t"+i+" \t"+loop);
}
flag=1;
conditionA.signal();
}finally {
lock.unlock();
}
}
}
public class ThreadCustomOper {
public static void main(String[] args) {
ShareResource sr=new ShareResource();
new Thread(()->{
for(int i=0;i<10;i++) {
try {
sr.print5(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"AA").start();
new Thread(()->{
for(int i=0;i<10;i++) {
try {
sr.print10(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"BB").start();
new Thread(()->{
for(int i=0;i<10;i++) {
try {
sr.print15(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"CC").start();
}
}