Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特殊形式,多线程占用更小的资源开销。一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。
多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。
线程的生命周期(总共有四个状态:新建,就绪,运行,阻塞,死亡)如下图所示
线程的生命周期新建状态:使用 new 关键字和 Thread 类或其子类建立一个线程对象知道start()执行,该状态结束。
就绪状态:就绪状态的线程处于就绪队列中,等待JVM里线程调度器的调度。
运行状态:就绪状态的线程获取 CPU 资源,执行 run(),处于运行状态的线程可变为阻塞状态、就绪状态和 死亡状态。
阻塞状态:一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源的状态。包括等待阻塞,同步阻塞,其它阻塞。
死亡状态:一个运行状态的线程完成任务或者其他终止条件发生时。
线程的优先级
每一个 Java 线程都有一个优先级,有助于操作系统确定线程的调度顺序。优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台。
线程的创建(3种方法)
第1种 通过实现 Runnable 接口;(最简单的方法)
//通过实现 Runnable 接口来创建线程
public class RunnableTestimplements Runnable{
private Threadt; //申明线程t
private Stringthreadname; //进程名称
RunnableTest(String name){ //新建状态
threadname = name;
System.out.println("创建线程:"+threadname);
}
public void run(){
System.out.println("执行线程:"+threadname);
try{
for(int i=4;i>0;i--){ //执行线程,运行状态
System.out.println("线程:"+threadname+","+i);
Thread.sleep(50); //线程进入休眠
}
}catch(InterruptedException i){
System.out.println("线程:"+threadname+"中断"); //阻塞状态
}
System.out.println("线程"+threadname+"结束"); //死亡状态
}
public void start(){
System.out.println("开始线程:"+threadname);
if(t==null){
t =new Thread (this,threadname);
t.start(); //就绪状态
}
}
}
运行结果如下:
第2种 通过继承 Thread 类本身;
public class ThreadTestextends Thread{
private Threadt; //申明线程t
private Stringthreadname; //线程名称
ThreadTest(String name){ //新建状态
threadname = name;
System.out.println("创建线程:"+threadname);
}
public void run(){
System.out.println("执行线程:"+threadname);
try{
for(int i=4;i>0;i--){ //运行状态
System.out.println("线程:"+threadname+","+i);
Thread.sleep(50); //进程休眠
}
}catch(InterruptedException i){
System.out.println("线程:"+threadname+"中断"); //阻塞状态
}
System.out.println("线程"+threadname+"结束"); //死亡状态
}
public void start(){
System.out.println("开始线程:"+threadname);
if(t==null){
t =new Thread (this,threadname);
t.start(); //就绪状态
}
}
}
运行结果如下:
第3种 通过 Callable 和 Future 创建线程。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
//通过 Callable 和 Future 创建线程
public class CallableThreadTestimplements Callable {
public static void main(String [] args){
CallableThreadTest test =new CallableThreadTest();
FutureTask fu =new FutureTask<>(test);
for (int i=0;i<3;i++){ //新建状态,子线程
System.out.println(Thread.currentThread().getName()+"的循环变量i的值:"+i);
if(i==2){
new Thread(fu,"有返回的线程:").start(); //子线程处于就绪状态
}
}
try{
System.out.println("子线程的返回值:"+fu.get());//返回子线程
}catch (InterruptedException i){
i.printStackTrace();
}catch (ExecutionException e){
e.printStackTrace();
}
}
@Override
public Integer call()throws Exception {
int i =0;
for (;i<3;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
return i;
}
}
运行结果如下:
网友评论