java基础之多线程闭锁

     2022-03-24     494

关键词:

1.闭锁方式1:利用CountDownLatch进行闭锁

import java.util.concurrent.CountDownLatch;

public class CloseLock3 {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		CountDownLatch latch = new CountDownLatch(5);
		CountEven even = new CountEven(latch);
		for (int i = 1; i <= 5; i++) {
			new Thread(even).start();
		}
		try {
			latch.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		long end = System.currentTimeMillis();
		System.out.println("偶数个数为:" + even.getNum());
		System.out.println("耗时为:" + (end - start));
	}
}

class CountEven implements Runnable {
	private int i = 100;
	private boolean flag = true;
	private int num;
	private CountDownLatch latch;

	public CountEven(CountDownLatch latch) {
		super();
		this.latch = latch;
	}

	@Override
	public void run() {
		try {
			while (flag) {
				synchronized (this) {
					if (i >= 0) {
						if (i % 2 == 0) {
							System.out.println(Thread.currentThread().getName() + ":" + i + "是一个偶数");
							num++;
						}
						i--;
					} else {
						flag = false;
					}
				}
			}
		} finally {
			latch.countDown();
		}
	}

	public int getNum() {
		return num;
	}
}

 2.闭锁方式2:利用Callable的返回值进行闭锁

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class CloseLock {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		CountEven even = new CountEven();
		FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {
			@Override
			public Integer call() throws Exception {
				even.even();
				return null;
			}
		});
		new Thread(task, "线程1").start();
		try {
			task.get();//阻塞式方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		long end = System.currentTimeMillis();
		System.out.println("偶数个数为:" + even.getNum());
		System.out.println("耗时为:" + (end - start));
	}
}

class CountEven {
	private int i = 100;
	private boolean flag = true;
	private int num;

	public void even() {
		while (flag) {
			synchronized (this) {
				if (i >= 0) {
					if (i % 2 == 0) {
						System.out.println(Thread.currentThread().getName() + ":" + i + "是一个偶数");
						num++;
					}
					i--;
				} else {
					flag = false;
				}
			}
		}
	}

	public int getNum() {
		return num;
	}
}

 3. 利用isalive进行闭锁

public class CloseLock {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		CountEven even = new CountEven();
		Thread thread = new Thread(even);
		thread.start();
		while (thread.isAlive()) {
          //thread线程没结束则一直死循环
		}
		long end = System.currentTimeMillis();
		System.out.println("偶数个数为:" + even.getNum());
		System.out.println("耗时为:" + (end - start));
	}
}

class CountEven implements Runnable {
	private int i = 100;
	private boolean flag = true;
	private int num;

	@Override
	public void run() {
		while (flag) {
			synchronized (this) {
				if (i >= 0) {
					if (i % 2 == 0) {
						System.out.println(Thread.currentThread().getName() + ":" + i + "是一个偶数");
						num++;
					}
					i--;
				} else {
					flag = false;
				}
			}
		}
	}

	public int getNum() {
		return num;
	}
}

 4.利用线程组进行闭锁

public class CloseLock {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		CountEven even = new CountEven();
		ThreadGroup group = new ThreadGroup("线程组1");
		Thread thread = new Thread(group,even);
		Thread thread1 = new Thread(group,even);
		thread.start();
		thread1.start();
		while (group.activeCount()!=0) {//activeCount()方法主要用于测试
			
		}
		long end = System.currentTimeMillis();
		System.out.println("偶数个数为:" + even.getNum());
		System.out.println("耗时为:" + (end - start));
	}
}

class CountEven implements Runnable {
	private int i = 100;
	private boolean flag = true;
	private int num;

	@Override
	public void run() {
		while (flag) {
			synchronized (this) {
				if (i >= 0) {
					if (i % 2 == 0) {
						System.out.println(Thread.currentThread().getName() + ":" + i + "是一个偶数");
						num++;
					}
					i--;
				} else {
					flag = false;
				}
			}
		}
	}

	public int getNum() {
		return num;
	}
}

  

  

java之多线程优先级基础

  线程得到cpu的给的时间才能运行有一个同步方法,里面有一个线程进去了,外面A,B俩线程在排队,A优先级比B优先级高,等到同步方法里面的线程出去了,一定是A先进去;  但是:  因此,仅将高优先级赋予一个线程,... 查看详情

java基础之多线程知识懂多少

线程基本创建和启动方式不考虑线程池的情况下,创建和启动线程的基本方式有如下几种1.直接newThread类或者子类,2.实现runnable接口然后传递给Thread,这种方式更加灵活3.使用lambda表达式,实际上是实现runnable另一种写... 查看详情

java之多线程基础消费者和生产者关系

1.多线程重复出现某结果 如下:已经卖完了和仓库已经满了会出现多次publicclassProductAndConsumer{ publicstaticvoidmain(String[]args){ Clerkclerk=newClerk(); Productproduct=newProduct(clerk); Consumerconsumer=newConsumer(clerk) 查看详情

java基础之多线程总结三(aqsthreadlocal和线程池)(代码片段)

AQS多线程里很多新型锁实现的关键是AQS,AQS指的是AbstractQueuedSynchronizer这个类,整个锁实现过程的关键是CAS操作加volatile。拿ReentrantLock非公平锁的lock和unlock举例,首先lock的源码中调用过程如下:ReentrantLock.lock()--&g... 查看详情

java基础之多线程总结一(创建状态synchronized和volatile)(代码片段)

线程基本创建和启动方式不考虑线程池的情况下,创建和启动线程的基本方式有如下几种1.直接newThread类或者子类,2.实现runnable接口然后传递给Thread,这种方式更加灵活3.使用lambda表达式,实际上是实现runnable另一种写... 查看详情

并发编程之多线程基础-守护线程与非守护线程

守护线程与主线程之间的联系:Java中有两种线程,一种是用户线程,另一种是守护线程。用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止用户线程属于非守护线程守护线程当进程不存在或主线程停止,守护... 查看详情

java基础之多线程总结二(cas和各种常用锁)(代码片段)

CAS在java中,对很多常见的需要加锁的操作进行了封装,例如Atomic开头的一些类,这些类是线程安全的,但是内部却不是用synchronized加锁实现,而是CAS。例如AtomicInteger的’incrementAndGet()'方法最终调用的实际... 查看详情

java之多线程(代码片段)

...进行资源分配和调度的基本单位,是操作系统结构的基础,每个进程在执行过程中拥有独立的内存单元。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的 查看详情

并发编程之多线程基础-线程五种状态

原文地址:https://www.cnblogs.com/wangyichuan/p/5990821.html 线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。    1.新建状态(New):      &n... 查看详情

futuretask——另一种闭锁的实现

关于多线程,我们接触对多的,最基础,入门的可能就是实现Runnable接口继承Thead类,因为Java单继承的原因,通常建议是实现Runnable接口。但这种“简单”的线程会带来一个问题,写过的人都知道,不管是实现Runnable还是继承Thread... 查看详情

python3之多线程基础学习(代码片段)

参考资料python3多线程官网多线程优点多线程类似于同时执行多个不同程序,多线程运行有如下优点:1、使用线程可以把占据长时间的程序中的任务放到后台去处理。2、用户界面可以更加吸引人,比如用户点击了一个按钮去触发... 查看详情

并发编程之多线程基础篇及面试

线程与进程区别每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级... 查看详情

java之多线程讲解

一、线程解析(1)线程的创建  1、继承Thread类创建线程类,代码如下://1、定义一个继承Thread类的子类,并重写该类的run()方法;//2、创建Thread子类的实例,即创建了线程对象;//3、调用该线程对象的start()方法启动线程。clas... 查看详情

java并发:等待事件发生后所有线程继续执行

 等待某一个指定的事件发生后,才让多个等待的线程继续执行,以下是我能想到的几个方法,欢迎讨论、指正。 1.闭锁CountDownLatch闭锁是典型的等待事件发生的同步工具类,将闭锁的初始值设置1,所有线程调用await方法... 查看详情

java之多线程

package com.yuanzijian01;/* *  线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务. 生产者与消费者wait():  等待   如果线程执行了wait方法,那么该线程会进入等... 查看详情

java之多线程

/***测试Thread中的常用方法:*1.start():启动当前线程;调用当前线程的run()*2.run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中*3.currentThread():静态方法,返回执行当前代码的线程*4.getName():获取当前... 查看详情

转多线程闭锁(latch)栅栏(cyclicbarrier)

java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)标签:java并发编程2015-05-2816:452939人阅读评论(0)收藏举报本文章已收录于:.embody{padding:10px10px10px;margin:0-20px;border-bottom:solid1px#ededed;}.embody_b{margin:0;padding:10px0;}.em 查看详情

并发编程之多线程基础-thread和runnable的区别及联系

上篇文章讲述了创建线程的常用方式本篇主要分析一下Thread和Runnable两种方式创建线程的区别及联系联系:?Thread类实现了Runable接口。?都需要重写里面Run方法。区别:?Thread方式不支持多继承,Runnable方式支持多个实现?Runnable更容易... 查看详情