进程是程序的一种动态形式,是CPU、内存等资源占用的基本单位。每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。线程的划分尺度小于进程,它隶属于某个进程,不能独立占有这些资源。
多线程机制,允许在程序中并发执行多个指令流,每个指令流都称为一个线程。一个进程中的线程间相互独立,共用一块内存区域,容易共享数据、进行通信。
java中实现线程类,有两种方法:
(1)实现java.lang.Runnable接口
class TestRunnable implements Runnable{
public void run(){
……
}
}
Thread t1 = new Thread(TestRunnable());
t1.start();
(2)继承自java.lang.Thread类
class TestThread extends Thread{
public void run(){
……
}
}
TestThread t2 = new TestThread();
t2.start();
由于java类不能多继承,当线程类继承了Thread类后,就不能再继承其它的类。而实现Runnable接口,就不会有这样的问题;
Thread提供了很多关于线程的方法,例如获取线程id、线程名、线程状态等方法,比Runnable使用起来更方便;
实现Runnable接口的线程类的多个线程,可以更方便的访问同一变量,而Thread类则需要内部类来进行替代。
使用synchronized让线程同步
(1)同步代码块,在一个对象上加锁
public void int num;
public Object obj = new Object();
……
public void run(){
synchronized(obj){
for(int i =0;i < 100;i++){
System.out.println("index = " + index++);
}
}
}
(2)同步方法
public synchronized void testMethod(){
……
}
Java线程池
线程池属于对象池,是一个或多个线程的集合,可以最大限度地复用线程。
java使用java.util.concurrent.ThreadPoolExecutor类来使用线程池,通过它构造的对象,可以很容易地管理线程。将线程代码与业务代码相分离,提高了线程的执行效率。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
ThreadPoolExecutor pool= new ThreadPoolExecutor(1,1,0,TimeUnit.SECONDS,
new ArrayBlockingQueue(5),
new ThreadPoolExecutor.DiscardOldestPolicy());
pool.execute(new Runnable(){
public void run(){……}
});