JAVA多线程(二)
Synchronized的使用:
(一)synchronized: Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
当某个方法或者代码块被声明为”synchronized”后,保存数据的内存空间(例如堆内存)将保持被同步状态。这意味着:当一个线程获取锁并且执行到已被声明为synchronized的方法或者代码块时,该线程首先从主堆内存空间中读取该锁定对象的所有变化,以确保其在开始执行之前拥有最新的信息。在synchronized部分执行完毕,线程准备释放锁的时候,所有针对被锁定对象的修改都将为写入主堆内存中。这样其他线程在请求锁的时候就可以获取最新的信息。
(二)创建线程的三种方法:
1、继承Thread public class AddThread extends Thread{}
2、实现Runnable public class AScaleThread implements Runnable{}
3、建立线程池 ExecutorService service = Executors.newFixedThreadPool(2);
(三)Synchroized的经典生产者与消费者问题:
代码1:
package com.my.thread; public class NumFactory { public int num = 10; public int total = 20; //非同步方法
public void add(){
num = num+2;
} public void scale(){
num--;
} //同步方法
public synchronized void addSync(){
while(num > 20){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify();
num = num + 2;
System.out.println("生产了两个。当前数量:==="+num); } public synchronized void scaleSync(){
while(num < 10){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify();
num--;
System.out.println("消费了一个。当前数量:==="+num);
} }
NumFactory.java
package com.my.thread; public class AddThread extends Thread{ public NumFactory factory; public AddThread(NumFactory factory) {
this.factory = factory;
} @Override
public void run() {
for (int i = 0; i < 10; i++) {
factory.addSync();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
AddThread.java
package com.my.thread; public class AScaleThread implements Runnable{ public NumFactory factory; public AScaleThread(NumFactory factory) {
this.factory = factory;
} @Override
public void run() {
for (int i = 0; i < 20; i++) {
factory.scaleSync();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
AScaleThread.java
package com.my.thread; public class MainThread { public static void main(String[] args) { /*BlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(consumer).start();
new Thread(producer).start();
*/ NumFactory factory = new NumFactory();
new Thread(new AScaleThread(factory)).start();
new AddThread(factory).start(); }
}
MainThread.java
代码2:
package com.my.thread; public class AddThread extends Thread{ public NumFactory factory; public AddThread(NumFactory factory) {
this.factory = factory;
} @Override
public void run() {
synchronized (factory) {
while (factory.num > 20) {
try {
factory.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
factory.notify();
factory.add();
System.out.println("生产了两个,还剩下:==="+factory.num);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} }
package com.my.thread; public class MainThread { public static void main(String[] args) { /*BlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(consumer).start();
new Thread(producer).start();
*/ NumFactory factory = new NumFactory();
for (int i = 0; i < 10; i++) {
new Thread(new AScaleThread(factory)).start();
new AddThread(factory).start();
}
}
}
package com.my.thread; public class AScaleThread implements Runnable{ public NumFactory factory; public AScaleThread(NumFactory factory) {
this.factory = factory;
} @Override
public void run() {
synchronized (factory) {
while (factory.num < 15) {
try {
factory.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
factory.notify();
factory.scale();
System.out.println("消费了一个,还剩下:==="+factory.num);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
代码3: 用BlockingQueue解决同步问题:
package com.my.thread; import java.util.concurrent.BlockingQueue; public class Producer implements Runnable{ BlockingQueue<String> block; public Producer(BlockingQueue<String> block){
this.block = block;
} @Override
public void run() {
try {
block.put(Thread.currentThread().getName());
System.out.println("放入到队列中:==="+Thread.currentThread().getName());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
Producer.java
package com.my.thread; import java.util.concurrent.BlockingQueue; public class Consumer implements Runnable{ BlockingQueue<String> block; public Consumer(BlockingQueue<String> block){
this.block = block;
} @Override
public void run() { try {
String take = block.take();
System.out.println("取出队列中的:==="+take);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
Consumer.java
package com.my.thread; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue; public class MainThread { public static void main(String[] args) { BlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(consumer).start();
new Thread(producer).start(); }
}
应该还有......
JAVA多线程(二)的更多相关文章
- java 多线程二
java 多线程一 java 多线程二 java 多线程三 java 多线程四 线程中断: /** * Created by root on 17-9-30. */ public class Test ...
- 从零开始学习Java多线程(二)
前面已经简单介绍进程和线程,为后续学习做铺垫.本文讨论多线程传参,Java多线程异常处理机制. 1. 多线程的参数传递 在传统开发过程中,我们习惯在调用函数时,将所需的参数传入其中,通过函数内部逻辑处 ...
- Java多线程(二) —— 深入剖析ThreadLocal
对Java多线程中的ThreadLocal类还不是很了解,所以在此总结一下. 主要参考了http://www.cnblogs.com/dolphin0520/p/3920407.html 中的文章. ...
- Java多线程(二) 多线程的锁机制
当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...
- java多线程(二)-Runnable和Thread
Java在顺序性语言的基础上提供了多线程的支持.Java的线程机制是抢占式的.这表示调度机制会周期的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片.(与抢占式多线程对应的是 协作式多线 ...
- java多线程(二)之实现Runnable接口
一.java多线程方式2: 实现Runnable接口 好处:a. 可以避免由于java单继承带来的局限性. b. 适合多个相同的程序的代码去处理同一个资源的情况, 把线程与程序的代码, 数据有效分离, ...
- java多线程二之线程同步的三种方法
java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Se ...
- java多线程(二)
线程的阻塞状态: 参考java多线程(一)多线程的生命周期图解,多线程的五种状态. 1.1 join(),如果在A线程体里面执行了B线程的join()方法,那么A线程阻塞,直到B线程生命周期结 ...
- Java多线程——<二>将任务交给线程,线程声明及启动
一.任务和线程 <thinking in java>中专门有一小节中对线程和任务两个概念进行了具体的区分,这也恰好说明任务和线程是有区别的. 正如前文所提到的,任务只是一段代码,一段要达成 ...
- java多线程(二)——锁机制synchronized(同步方法)
synchronized Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.当两个并发线程访问同一个对象object中 ...
随机推荐
- 烂泥:ESXI开启SNMP服务
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 要监控ESXI,打算通过snmp方式进行监控,这样操作比较简单.但是要使用SNMP方式进行监控,必须要开启ESXI的SNMP服务.ESXI由于版本号的不 ...
- my_mosaic
//功能:输入想要打马赛克的坐标点,宽,高以及每个边需要划分的块数进行打马赛克 //只能处理位图,根据不同色深定义depth即可 //还没写从文件头读取图片分辨率 #include<unistd ...
- linux 配合仅主机模式
- 基于vitamio的网络电视直播源码
这个项目是基于vitamio的网络电视直播源码,也是一个使用了vitamio的基于安卓的网络直播项目源码,可能现在网上已经有很多类似这样的视频播放应用了,不过这个还是相对来说比较完整的,希望这个案例能 ...
- 虚拟机centos6.5 --ssh免密码登录
说明:此处是以hadoop虚拟机3台机器为背景进行设置,即master.slave01.slave02 1.在master上,生成公钥.私钥 用hadoop用户登录系统,进入个人主目录,即/home/ ...
- for循环的省略
for (初始化语句; 条件语句; 控制语句){ 被执行的代码块 }; 例如: for (var i=0;i<cars.length;i++) { document.write(cars[i] ...
- 大话设计模式C++版——简单工厂模式
简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...
- [转]asp.net c# 网上搜集面试题目(附答案)
本文转自:http://www.cnblogs.com/hndy/articles/2234188.html 1.String str=new String("a")和String ...
- LoadRunner11.0下载及安装链接~(By网络)
Download and install O(∩_∩)O: http://www.jb51.net/softjc/71256.html
- UNITY 2D入门基础教程
Unity4.3增加了原生的2D开发环境,新建项目时选2D http://blog.1vr.cn/?p=1422