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中 ...
随机推荐
- 150929-拖延高于懒-HTML(End)
四天未更了,分别是因为Xshell和虚拟机链接不好,累,懒(好像是三天..) 就像我一直嗷嗷着要去学开出一样,5年都没有去......拖延症似乎比懒癌更可怕.慢慢的慢慢的,人长大了,小时候的一些东西才 ...
- 【CSS】使用CSS选择器
CCS选择器的作用是找出某类元素.以便使我们使用style元素或者外部样式表对这类元素设置样式. 1.使用CSS基本选择器 有些选择器使用起来非常简单,我们把这部分选择器称为基本选择器(basic s ...
- Thread 同步线程(打印机同步)
1.首先创建一个打印机对象 package cn.b.happy; public class Printer { Object o =new Object(); public void print() ...
- Code! MVC 5 App with Facebook, Twitter, LinkedIn and Google OAuth2 Sign-on (C#)
http://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2- ...
- Maven系列一pom.xml 配置详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- stl学习(二)集合 set 的使用
set集合容器底层由红黑树实现,是平衡二叉搜索树. 相对stl中的list.deque效率更高. 注意:由于集合 的 性质,单纯的 set 不允许重复的元素 初始化 / 清空 函数 : clear() ...
- TabBarController
1.两种方式创建系统TabBarController -(id)init{ self = [super init]; if( self ) { //newTask HSNewTaskViewContr ...
- 转- android硬件传感器
纯属转载:http://dev.10086.cn/cmdn/bbs/thread-41843-1-1.html 1.传感器入门 自从苹果公司在2007年发布第一代iPhone以来,以前看似和手机挨不着 ...
- FJOI省队集训 chessboard
(题目懒得打字了,建议到新窗口查看) 显然这玩意儿是可以按位搞的...然后就是一个裸的最小割模型? 然而这样做理论上只有30分实际上有40分. 事实上我们可以发现,每一列的取值只和上一列有关,这样我们 ...
- 查看Mysql实时执行的Sql语句
最近给客户开发了基于Asp.Net mvc5 +Mysql+EF的项目,但是在EF里无法看到Mysql执行的语句 之前也找到一些监控Mysql的软件但一直没有用起来,现在又遇到了问题即在EF里Mysa ...