一:多线程的定义
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。[1] 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。[来自百度百科]
二:在Java中,实现多线程编程主要使用两种方法
1、 继承自Thread类;
2、 实现Runnable接口。
三:线程的状态有
新建、可运行、阻塞、等待、定时等待和死亡状态。其中,新建状态即new Thread()之后,start()之前,可运行状态即start()之后但暂未获取其运行的某些资源,阻塞状态即被中断运行的状态(如线程正在等待其它的线程释放同步锁,或者它已经进入某个同步方法但调用了java.lang.Object.wai()方法),死亡状态即线程完成执行run()方法后的状态。
四:slee()方法和wait()方法的区别
sleep(long) 方法可以让调用它的线程休眠指定时间而不执行任何操作,除非被其它线程调用了该线程的interrupt()方法。调用sleep方法不会让线程释放它所持有的同步锁。此外,sleep(long)方法属于Thread类;
wait(long)方法可以让调用它的线程进入定时等待状态(wait()方法让线程进入等待状态直到其他线程调用该线程的notify()方法或者notifyAll()方法),一定时间以后等待结束。调用wait()方法之后会让线程释放它所有的同步锁。
五:进程间的通信
早期,线程同步主要是使用同步方法和同步块,只需要在方法或者代码块前添加synchronized关键字即可。当任意一个线程进入到一个对象的任意同步方法时,该对象的所有同步方法和同步块就被锁定了,直到线程使用完该对象的同步方法。如果线程使用的是静态同步方法,那锁定的不是这个对象,而是对应的java.lang.Class对象。在对象的同步方法被某个线程锁定的同时,对象的非同步方法是可以被其它线程使用的。
六:java.util.concurrent包
在Java 5之后,java.util.concurrent包及其子包的出现,是的并发得以使用简单的方法控制。因为在此之前,java需要使用上述的wait(),notify()和synchronized关键字来控制死锁和逻辑处理,而且需要考虑性能、公平性、资源管理和线程安全等诸多因素。
java.util.concurrent主要包括以下接口和类:
Executor:具体Runnable任务的执行者
ExecutorService:一个线程池管理者
Runnable,Callable提交到池中让其调度
Future:是与Runnable,Callable进行交互的接口
BlockingQueue:阻塞队列
附使用java.util.concurrent包的一个实例:
Test:写一个程序要求主线程等待子线程运行结束后退出,且子线程同时运行
Main.class
package net.chinaideal.concurrency.executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
private static final int NTHREDS = 10;
public static void main(String[] args) {
ExecutorService executor =
Executors.newFixedThreadPool(NTHREDS);
for (int i = 0; i < NTHREDS; i++)
{
Runnable
worker = new MyRunnable();
executor.execute(worker); }
executor.shutdown();
while
(!executor.isTerminated()) { }
System.out.println("Finished all threads");
}
}
MyRunnable.class
package net.chinaideal.concurrency.executor;
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
通过Executors.newFixedThreadPool(n);创建制定个数的工作线程池。java.util.concurrent.ExecutorService接口继承自java.util.concurrent.Executor接口,而Executor.execute的方法提供了一个运行Runnable类的方法。
因此在这个程序的实例中,使用Executors.newFixedThreadPool获得一个ExecutorService的实例,并通过执行ExecutorService.execute的方法运行定义好的MyRunnable实例。
通过不断运行ExecutorService.isTerminated()方法检测全部的线程是否都已经运行结束,ExecutorService.shutdown()将使之前通过Executor.execute()提交的任务运行结束后关闭线程池。ExecutorService还提供了一个与ExecutorService.shutdown()对应的方法名为ExecutorService.shutdownNow()该方法试图将结束已经提交的任务并结束线程池。
如果我们不调用ExecutorService.shutdown()或者ExecutorService.shutdownNow()方法,主线程将会一直阻塞住。
后续再对该包进行深入学习。