您的位置:首页 > 编程语言 > Java开发

java多线程

2016-03-03 14:59 417 查看
 多线程:在一个程序中允许同时运行多个任务

在java中,每个任务都是Runnable接口的一个实例,也称为可运行对象,线程本质上讲就是便于任务执行的对象。

任务就是对象,为了创建任务,首先必须为任务定义一个类。任务类必须实现Runnable接口。Runnable接口非常简单,只包含一个run方法。需要实现run方法告诉系统线程将如何运行。

 开发一个任务类:

 public class TaskClass implements Runnable{

      public TaskClass(){}

  

     public void run(){}

}

 一旦定义一个TaskClass类,就可以用它的构造方法创建一个任务

 TaskClass newTask = new TaskClass();

任务必须在线程中执行,Thread类包括创建线程的构造方法以及控制线程的很多有用的方法,创建线程:

 Thread  thread = new Thread(newTask);

然后调用start()方法告诉java虚拟机该线程准备运行

 thread.start()

java虚拟机通过调用任务的run方法执行任务

线程池:对于大量的任务如果为每个任务都创建一个线程时不可取的,线程池是管理并发执行任务个数的理想方法。java提供Executor接口执行线程池中的任务,提供ExecutorService接口来管理和控制任务。ExecutorService是Executor的子接口。

为创建Executor对象,可以使用Executors类中的静态方法--newFixedThreadPool(int) 方法在池中创建固定数目的线程

         //创建一个最大线程数为3的线程池执行器
ExecutorService executor = Executors.newFixedThreadPool(3);
executor.execute(new PrintCharTask('a', 100));
executor.execute(new PrintCharTask('b', 100));
executor.execute(new PrintNumTask(1, 100));
executor.shutdown();//关闭执行器

线程同步:

避免竞争状态,应该防止对个线程同时进入程序的某一特定部分,程序中的这部分叫做临界区。可使用关键字synchronized来同步方法,以便一次只有一个线程可以访问方法。

利用加锁同步:一个锁是Lock接口的实例,它定义了加锁和释放锁的方法,lock(),unlock();锁也可以使用newCondition()方法来创建任意个数的Condition对象,用来进行线程通信。

ReentrantLock 是为创建相互排斥的锁的Lock的具体实现。

private static Lock lock = new ReentrantLock();//创建一个lock

将临界区的内容放在try-catch中,先调用lock.lock()

在final中使用lock.unlock();

线程间相互协作:

使用条件便于线程间通信,一个线程可以指定在某种条件下该做什么,条件是通过调用Lock对象的newCondition()方法而创建对象,一旦创建了对象,就可以使用await(),signal(),signalAll()方法实现线程间的通信,await()方法可以让当前线程都处于等待状态,直到条件发生;singal()方法唤醒一个等待线程;signalAll()方法唤醒所有线程。

private static Condition newDeposit = lock.newCondition();

java内置监视器:

线程通信使用对象的内置监视器编程实现。

监视器是一个相互排斥具备同步能力的对象。监视器中的一个时间点上,只能有一个线程执行一个方法。线程通过获取监视器上的锁进入监视器,并且通过释放锁退出监视器。任意对象都可能是一个监视器。一旦一个线程锁住对象,该对象就成为监视器。加锁是通过在方法或块上使用synchronized关键字来实现的。在执行同步方法或块前,必须获取锁。如果条件不适合线程继续在监视器内执行,线程可能在监视器中等待。可以对监视器对象调用wait()方法来释放锁,这样其他的监视器中的线程就能获取它,也就有可能改变监视器的状态。当条件适合时,另一个线程可以调用notify()和notifyAll()方法来通知一个或所有的等待线程重新获取锁,并且恢复执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: