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中 ...
随机推荐
- dyld: Library not loaded: @rpath/libswiftCore.dylib 解决方法
解决: 设置Build Setting - > 搜索 embe关键字 -> 修改属性 见如下图: 如果更新了Xcode 8 这里变成:
- linux下怎么查看ssh的用户登录日志
linux下登录日志在下面的目录里: cd /var/log 查看ssh用户的登录日志: less secure linux日志管理: 1. 日志简介 日志对于安全来说,非常重要,他记录了系统每天发生 ...
- PHP生成器Generators
下文的第一个逐行读取文件例子用三种方式实现;普通方法,迭代器和生成器,比较了他们的优缺点,很好,可以引用到自己的代码中 ,支持的php版本(PHP 5 >= 5.5.0) 后面的yield讲解, ...
- django自动化部署脚本
while read line;do echo'kill '$line; kill $line; done < /tmp/celeryd.pid while read line;do echo' ...
- 初试MarkDown
· 要写个文档,突然就想到要不要试试学学MarkDown,整理一下大致过程 · 首先搜到这篇文章 ,简单介绍了MarkDown,以及OS X 平台上一个简单的工具 mou (目前仍免费) 相关新闻不做 ...
- php中的curl使用入门教程和常见用法实例
摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...
- python数字图像处理(9):直方图与均衡化
在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...
- Android开发中上线后修改应用名称的若干问题
一.在Android Studio 1.3中修改app的包名: 需求来源: 之前开发的app已经在腾讯的应用宝上线,应客户要求,app需要改名字,这个就有点麻烦了.如果申请改名字,要求如下: 截图上图 ...
- 在ios android设备上使用 Protobuf (使用dll方式)
http://game.ceeger.com/forum/read.php?tid=13479 如果你的工程可以以.Net 2.0 subset模式运行,请看这个帖子中的方法. 地址:http://g ...
- preg_match()漏洞
今天大哥丢了一道题过来. <?php $str = intval($_GET['id']); $reg = preg_match('/\d/is', $_GET['id']); //有0-9的数 ...