专注于深圳企业建站,深圳做网站首选建站公司收藏本站|设为首页

您现在的位置: 网站首页 > 网站专题 > 网络编程 > 详细内容

Java多线程提升

2010-12-7 14:15:24 来源: 云梯科技 www.wangzhan114.com [ ]

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;

  }

  }