java 线程的编写
目录
2、实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
一、线程的状态
线程状态流程图如下:
1、创建
使用new关键字和Thread类或者其子类建立一个对象后,该线程对象就处于新建的状态。它保持这个状态直到程序start()这个线程状态。
2、就绪
当线程对象调用了start()方法后,该线程就进入了就绪状态。就绪状态的线程处于就绪队列中,要等待JVM线程调度器的调度。
3.、运行
如果就绪状态的线程获取了cpu资源,就可以执行run(),此时线程便于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态,就绪状态和死亡状态。
4、阻塞
如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入了阻塞状态。在睡眠时间已到或者获得设备资源后可以重新进入就绪状态,可以分三种:
.等待阻塞:运行时状态中的线程执行wait()方法,是线程进入到等待阻塞状态。
.同步阻塞:线程在获取synchronized同步锁失败(因为同步锁被其他线程占用)。
.其他阻塞:通过调用线程的sleep()或join()发出I/O请求时,线程就进入到阻塞状态。sleep()状态超时,join()等待线程终止超时,或者I/O处理完毕,线程重新转入就绪状态。
5、终止
一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。
二、多线程的实现方式
1、继承Thread类,重写run方法
继承Thead类的线程实现的步骤如下:1.继承Thead,2.重写其Thead中的run方法。代码如下:
编写线程类ThreadTest1:
public class ThreadTest1 extends Thread{
public ThreadTest1(String name){
//编写子类的构造方法,可缺省
super();
setName(name);
}
public void run(){
//编写自己的线程代码
System.out.println("当前线程的名称: "+Thread.currentThread().getName());
}
}
编写使用线程main类:
public class main {
public static void main(String[] args ){
ThreadTest1 mThreadTest1 =new ThreadTest1("我是自定义的线程");
mThreadTest1.start();
System.out.println(Thread.currentThread().toString());
}
}
结果如下:
Thread[main,5,main]
当前线程的名称: 我是自定义的线程
2、实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
实现Runnable接口来创建线程的步骤:1.编写Runable接口实现类MyRunable,重写run方法。2.创建一个MyRunnable类的一个实例myRunnable ,3.使用myRunnable 实例去创建线程,然后启动线程。代码如下:
编写线程Runable接口MyRunnable:
public class MyRunnable implements Runnable {
public void run() {
// TODO Auto-generated method stub
System.out.println("通过Runnable接口实现的线程: "+Thread.currentThread().getName());
}
}
编写使用线程main类:
public class main {
public static void main(String[] args ){
//创建Runnable接口
MyRunnable myRunnable = new MyRunnable();
//创建线程
Thread mThread =new Thread(myRunnable);
mThread.setName("通过接口创建的线程");
mThread.start();
System.out.println(Thread.currentThread().toString());
}
}
结果如下:
Thread[main,5,main]
通过Runnable接口实现的线程: 通过接口创建的线程
3、通过Callable和FutureTask创建线程
通过Callable和FutureTask创建线程实现步骤如下:1.创建Callable接口实现类,并实现Call方法。2.创建Callable实现类的实例,使用FutureTask类包装Callable对象,该FutureTask对象封装了Callable对象的Call方法返回值。3.使用FutureTask对象作为Thread对象的target创建并启动线程。4.调用FutureTask对象的get()来获取子线程执行结束的返回值。
Callable接口实现类MyCallable的代码:
public class MyCallable<Object> implements Callable<Object> {
public Object call() throws Exception {
// TODO Auto-generated method stub
System.out.println("通过Callable实现的线程: "+Thread.currentThread().getName());
return null;
}
}
创造线程的main类:
public class main {
public static void main(String[] args ){
//创建Callable接口实例
MyCallable<Object> mMyCallable = new MyCallable<Object>();
//创建线程
FutureTask<Object> oneTask = new FutureTask<Object>(mMyCallable);
Thread mThread =new Thread(oneTask);
mThread.setName("这是通过Callable创建的线程");
mThread.start();
System.out.println(Thread.currentThread().toString());
}
}
运行结果:
Thread[main,5,main]
通过Callable实现的线程: 这是通过Callable创建的线程
4、通过线程池创建线程
通过线程池创建线程实现的步骤:1.编写Runable接口实现类ThreadPoolRunnable,重写run方法。2.创建线程池服务实例executorService。3.创建一个ThreadPoolRunnable类的一个实例mThreadPoolRunnable ,3.使用mThreadPoolRunnable 实例去增加线程服务。4.使用executorService.shutdown()方法关闭线程服务。
Runable接口实现类ThreadPoolRunnable的代码:
public class ThreadPoolRunnable implements Runnable{
public void run() {
// TODO Auto-generated method stub
System.out.println("通过线程池方式创建的线程: "+Thread.currentThread().getName());
}
}
使用线程服务的main类:
public class main {
private static int POOL_NUM=10;
public static void main(String[] args ){
//创建线程池服务
ExecutorService executorService = Executors.newFixedThreadPool(5);
for(int i=0;i<POOL_NUM;i++){
//创建Runnable接口实例
ThreadPoolRunnable mThreadPoolRunnable = new ThreadPoolRunnable();
//给线程池添加Runnable接口实例
executorService.execute(mThreadPoolRunnable);
}
//关闭线程池
System.out.println(Thread.currentThread().getName());
executorService.shutdown();
}
}
结果运行:
通过线程池方式创建的线程: pool-1-thread-1
通过线程池方式创建的线程: pool-1-thread-2
通过线程池方式创建的线程: pool-1-thread-3
通过线程池方式创建的线程: pool-1-thread-4
main
通过线程池方式创建的线程: pool-1-thread-3
通过线程池方式创建的线程: pool-1-thread-5
通过线程池方式创建的线程: pool-1-thread-1
通过线程池方式创建的线程: pool-1-thread-2
通过线程池方式创建的线程: pool-1-thread-4
通过线程池方式创建的线程: pool-1-thread-3
三、线程的同步
四、线程池