java 6种常用控制线程方式整理_java中对于线程的控制方法有哪些 (1)

文章介绍了四个Java并发编程的实现,包括使用CyclicBarrier、volatile布尔标志、可重入锁和Condition,以及synchronized与标志位控制线程执行顺序。这些示例展示了如何在多线程中管理和协调任务执行。
摘要由CSDN通过智能技术生成
public FooBar6(int n) {
    this.n = n;
}

CyclicBarrier cb = new CyclicBarrier(2);
volatile boolean fin = true;

public void foo(Runnable printFoo) throws InterruptedException {
    for (int i = 0; i < n; i++) {
        while(!fin);
        printFoo.run();
        fin = false;
        try {
            cb.await();
        } catch (BrokenBarrierException e) {}
    }
}

public void bar(Runnable printBar) throws InterruptedException {
    for (int i = 0; i < n; i++) {
        try {
            cb.await();
        } catch (BrokenBarrierException e) {}
        printBar.run();
        fin = true;
    }
}

}


#### 3.自旋 + 让出CPU



class FooBar5 {
private int n;

public FooBar5(int n) {
    this.n = n;
}

volatile boolean permitFoo = true;

public void foo(Runnable printFoo) throws InterruptedException {     
    for (int i = 0; i < n; ) {
        if(permitFoo) {
    	    printFoo.run();
        	i++;
        	permitFoo = false;
        }else{
            Thread.yield();
        }
    }
}

public void bar(Runnable printBar) throws InterruptedException {       
    for (int i = 0; i < n; ) {
        if(!permitFoo) {
    	printBar.run();
    	i++;
    	permitFoo = true;
        }else{
            Thread.yield();
        }
    }
}

}


#### 4. 可重入锁 + Condition



class FooBar4 {
private int n;

public FooBar4(int n) {
    this.n = n;
}
Lock lock = new ReentrantLock(true);
private final Condition foo = lock.newCondition();
volatile boolean flag = true;
public void foo(Runnable printFoo) throws InterruptedException {
    for (int i = 0; i < n; i++) {
        lock.lock();
        try {
        	while(!flag) {
                foo.await();
            }
            printFoo.run();
            flag = false;
            foo.signal();
        }finally {
        	lock.unlock();
        }
    }
}

public void bar(Runnable printBar) throws InterruptedException {
    for (int i = 0; i < n;i++) {
        lock.lock();
        try {
        	while(flag) {
                foo.await();
        	}
            printBar.run();
            flag = true;
            foo.signal();
        }finally {
        	lock.unlock();
        }
    }
}

}


#### 5. synchronized + 标志位 + 唤醒



class FooBar3 {
private int n;
// 标志位,控制执行顺序,true执行printFoo,false执行printBar
private volatile boolean type = true;
private final Object foo= new Object(); // 锁标志

public FooBar3(int n) {
    this.n = n;
}
public void foo(Runnable printFoo) throws InterruptedException {
    for (int i = 0; i < n; i++) {
        synchronized (foo) {
            while(!type){
                foo.wait();
            }
            printFoo.run();
            type = false;
            foo.notifyAll();
        }
    }

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

数据知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值