多线程核心点

多线程编程核心:同步、线程通信
下面通过java演示多个生产-多个消费者来分析【同步】与【线程通信】
同步:生产者之间、消费者之间、生产与消费者之间
线程通信:生产向消费者发送通知:完成生产; 消费向生产发送通知:完成消费。

直接上代码

package javaapplication1;

public class JavaApplication1 {
//用于演示的主类
public static void main(String[] args) {
Container Student = new Container();
for (int i = 0; i < 7; i++) {
new Thread(new Produce(Student), String.format("生产%s", i)).start();
new Thread(new Consome(Student), String.format("消费%s", i)).start();
}
}
}

package javaapplication1;

//生产者
public class Produce implements Runnable {

private Container student;

public Produce(Container student) {
this.student = student;
}

public void run() {
for (int i = 0; i < 1; i++) {
synchronized (student.write) { //消费锁同步
synchronized (student.container) { //容器同步:生产-消费
if (this.student.value != 0) {
try {
this.student.container.wait();
} catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
}

this.student.allValue += 1;
this.student.value = this.student.allValue;
System.out.println(String.format("%s, 生产了%s", Thread.currentThread().getName(), this.student.value));
this.student.container.notify();
}
}
}
}
}

package javaapplication1;

//消费者
public class Consome implements Runnable {

private Container student;

public Consome(Container student) {
this.student = student;
}

public void run() {
for (int i = 0; i < 1; i++) {
synchronized (student.read) { //消费锁同步
synchronized (student.container) { //容器同步:生产-消费
if (this.student.value == 0) {
try {
this.student.container.wait();
} catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
}

System.out.println(String.format("%s, 消费了%s", Thread.currentThread().getName(), student.allValue));
this.student.value = 0;
this.student.container.notify();
}
}
}
}
}

package javaapplication1;

//生产-消费的容器
public class Container {

protected int value;
protected int allValue;
protected String write;
protected String read;
protected String container;

public Container() {
this.write = "write";
this.read = "read";
this.container = "container";
}
}

时间: 2024-08-09 02:17:48

多线程核心点的相关文章

多线程并发的使用、学习与测试

使用 先说说多线程的使用.多线程本身是与我们开发的项目密不可分的,我们只要提供了接口,那么他就可能被多个线程同时调用,就会产生并发问题,因此开发者在实际开发中对多线程的理解至关重要.当然,这属于最基本的认识. 就这一方面而言,对于开发者及学过并发的学员,平时开发中需要掌握的主要包括: 1.先说涉及最多的.看到static修饰的变量时,能想到涉及到多线程资源共享.如果是可变的,需要注意变化中的线程安全;如果是不可变的,需要知道如何保证其不可变,而不是简单的放在那,当前代码没有修改他就认为他是不变的

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Spring多线程

Spring是通过TaskExecutor任务执行器来实现多线程和并发编程的.使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.而实际开发中任务一般是非阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务. 实例代码: (1)配置类 package com.lwh.highlight_spring4.ch3.taskexecutor; /**

python进阶学习(一)--多线程编程

1. 多线程 概念:简单地说操作系统可以同时执行多个不用程序.例如:一边用浏览器上网,一边在听音乐,一边在用笔记软件记笔记. 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务"一起"执行(实际上总有一些任务不在执行,因为切换任务的熟度相当快,看上去一起执行而已) 并行:指的是任务数小于等于CPU核数,即任务真的是一起执行的. 2. 线程 概念:线程是进程的一个实体,是CPU调度和分派的基本单位. threading--单线程执行: 1 import ti

多线程的实现及其安全问题

一.进程和线程概述 1.进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动,简单来说开启一个程序就开启了一个进程: 如果开启多个进程,它们之间是由于CPU的时间片在相互的切换: 2.线程:开启一个进程的一个任务,对于多线程:每一个线程都在争夺CPU的执行权(CPU的执行权具有随机性): 如果一个程序的执行路径有多条,那么该线程是多线程;反之,就单线程线程:线程是依赖于进程存在的! 3.Jvm是多线程 -- 至少开启了两条线程 main方法 主线程 gc() 垃圾回收线程 二.多线程

多线程和多进程的区别与联系

1.单进程单线程:一个人在一个桌子上吃菜.2.单进程多线程:多个人在同一个桌子上一起吃菜.3.多进程单线程:多个人每个人在自己的桌子上吃菜. 多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了...此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢. 1.对于 Windows 系统来说,[开桌子]的开销很大,因此 Windows 鼓励大家在一个桌子上吃菜.因此 Windows 多线程学习重点

Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?

最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效率中的差异,注释:在爬虫中我几乎没有使用任何计算性任务,为了探测异步的性能,全部都只是做了网络IO请求,就是说aiohttp把网页get完就程序就done了. 结果发现前者的效率比后者还要高.我询问了另外一位博主,(提供代码的博主没回我信息),他说使用concurrent.futures的话因为我全

多线程(一)

这边来谈谈java中,我对对多线程的理解 在了解多线程前,先说说进程. 进程就是正在运行的应用程序.  当你打开任务管理器的时候,你就会发现很多的进程. 而我们要说的线程,就是依赖于进程而存在的,一个进程可以开启多个线程. Thread类 说到线程,就必须来说说Thread类. Thread类是说有线程的父类.具体请参见api 线程的创建以及执行(图解如下) 继承Thread类,或者实现rennable接口. 当继承了父类后,需要重写父类的run方法,这个run方法里面就写你要执行的代码,当这个

多线程下的单例-double check

话不多说直接上代码: public sealed class Singleton { private static Singleton _instance = null; // Creates an syn object. private static readonly object SynObject = new object(); Singleton() { } public static Singleton Instance { get { // Double-Checked Lockin