西安网站建设-西安网站制作-专业西安网站制作公司-「力洋网络」

西安力洋网络
  • 西安网站建设
  • 西安网站制作
  • 西安网站建设
  • Java多线程提升

  • 发布者:本站 发布时间:2010/12/7 14:15:24
  • 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;

      }

      }

     

  • 返回列表
    相关阅读
    更多
    深度挖掘网站的商用价值,化繁为简的设计,为企业找到直接有效的解决方案
    +86 (029) 88765320
    +86 15829904657
    地址:西安市太华北路369号
    万达广场4#23F P.C:7100001
    985224206@qq.com
    在线咨询: 985224206
    互联网协会成员单位
    西安力洋之星网络技术有限公司 | 版权所有
    Copyright 2008-2020 Liyang.Inc All Rights Reserved.
    Liyang.Inc