Java多线程提升
Java多线程提升
独占:通过阻止多个并发行为间的有害干扰来维护状态的一致性。通常使用异步方法sychronized
状态依赖:触发,阻止,延迟,恢复,某些行为是由一些对象是否处在这些行为可能成功或者已经
成功的状态决定的。主要通过监视器(monitor)实现 object.wait object.notify, object.notifyAll
客户Client: Client Object 期待某个动作的执行
服务Serverce :包括执行这个动作的代码
主体:客户和服务都可以是一个对象,这个对象就是一个主体。而又他调用的对象通常就是辅助对象(help)
Synchronized: 防止并法导致数据不一致,可以修饰一个方法或者代码块。
1.Object 或子类的每一个实例都会在进入这个synchronized方法前加锁,并在离开这个方法时自动释放锁,
使用synchronized关键字来定义方法就会锁定类中所有使用synchronzied关键字定义的静态方法或非静态方法
不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
对于修饰静态的方法它可以对类的所有对象实例起作用。
2.对代码块的加锁也是,只是需要指明对那个对象加锁。在静态代码块中使用类.class来指明,
在非静态代码块中多数是用this
3.synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法
规则:
1)永远只是在更新对象的成员变量是加锁
2)永远只是在访问有可能被更新对象的成员变量时加锁
3)永远不要在调用其它对象的方法时加锁
二、 java.util.concurent 包介绍
1、执行器(Executor) 用来管理Thread 对象,下面介绍三种Executor
(1) newCachedThreadPool
ExecutorService exec = Executors.newCachedThreadPool();//创建一个可根据需要创建新线程的线程池
for(int = 0 ; i<5; i++){
exec.execute(new LiftOff());//LiftOff implements Runnable接口的类
exec.shutdown()
}
(2) newFixedThreadPool
ExecutorService exec = Executors.newFixedThreadPool(5);//创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
for(int = 0 ; i<5; i++){
exec.execute(new LiftOff());//LiftOff implements Runnable接口的类
exec.shutdown()
}
(3) newSingleThreadPool
SingleThreadPool 就好象是线程数量为1的FixedThreadPool,如果向SingleThreadPool提交多个任务,那么这些任务都将排列,每个任务都会在下一个任务开始之前运行结束。
ExecutorService exec = Executors.newSingleThreadPool();//创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
for(int = 0 ; i<5; i++){
exec.execute(new LiftOff());//LiftOff implements Runnable接口的类
exec.shutdown()
}
2、从任务中产生返回值
Runnable是执行工作的独立任务,但是不返回任何值,如果实现Callable 接口,则Callable接口方法call()可以返回一个值。
package cn.com.cdl.chen;
/**
* @ Class CallableDemo.java
* @ Description
* @ Company OpenData
* @ Author yinlei
* @ Version 1.0
* @ Date Mar 13, 2010
*/
import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableDemo{
public static void main(String[] args){
ExecutorService exec = Executors.newCachedThreadPool();
ArrayList<Future<String>> results = new ArrayList<Future<String>>();
for(int i = 0; i < 10; i++){
results.add(exec.submit(new TaskWithResult(i)));//这里使用submit 方法会产生Future 对象
}
for(Future<String> fs:results){
try{
if(fs.isDone()){//检查Future是否已经完成,或者不用isDone()来检查,那么get()将会阻塞,直到结果准备就绪。
System.out.println(fs.get());//通过get()得到call()方法返回的值,
}
} catch(Exception ex){
ex.printStackTrace();
} finally{
exec.shutdown();
}
}
}
}
class TaskWithResult implements Callable<String>{
private int id;
public TaskWithResult(int id){
this.id = id;
}
public String call(){
return "result of TaskWithResult" + id;
}
}