多线程
一、概念:
并行和并发:
并行是指多个事件在同一时刻发生。
并发是指多个事件在同一时刻间隔发生。
**多线程:**宏观上的并行,微观上的串行。
意义:解决并发。
**进程:**资源分配的最小单位,一个进程可以包含多个线程。
**线程:**程序执行的最小单位,一个线程至少属于一个进程。
二、线程的创建
1、继承Thread类
/**
*新增一个类,让该类继承Thread类,重写run()方法,相当于是该子类任务要 *去完成的操作。
**/
public class MyThread extends Thread{
@Override
public void run(){
//要执行的操作
}
public static void main(String []args){
//创建线程对象
MyThread t=new MyThread();
//调用线程的start()方法,会开启线程,JVM会自动调用run()方法
//无法开启一个已经开启的线程,否则会报 //IllegalThreadStateException异常。
t.start();
//run()方法可以直接被调用,但是并没有真正开启子线程。
t.start();
}
}
2、实现Runnable接口
通过实现Runnable接口,新增一个类,来实现run()方法,来完成子任务。
public class MyRunnable implements Runnable{
public static void main(String []args){
MyRunnable r=new MyRunnable();
Thread t = new Thread(r);
t.start();
@Override
public void run(){
//要执行的操作。
}
}
}
三、线程的方法
static Thread currentThread():
返回当前正在执行的线程对象的引用。
static void sleep(long millis):
在指定的毫秒数内让当前正在执行的线程进入休眠(阻塞)状态。
static void yield():
暂停当前正在执行的线程对象,并执行其他对象。(当前线程进入就绪态)
String getName():
返回线程的名称。
void setName(String name):
改变线程名称。
void setDaemon(boolean on):
将该线程标记为守护线程或用户线程。
void setPriority(int newPriority):
更改线程的优先级。
四、线程的启动
调用start()方法完成线程的开启,strat()会自动调用run()方法/
但是如果直接调用run(),不会有运行异常,并不会开启子线程,整个运行过程中只有一个main主线程。
无法启动一个已经启动了的线程,否则会抛出IlleaglThreadStateException异常。
五、线程的优先级
通过线程对象的setPriority()方法可以设置线程的优先级,优先级高的线程只是抢到cpu时间片的概率高,不一定比优先级低的线程先执行。
三个优先级常量:
MAX_PRIORITY 10
NORM_PRIORITY 5
MIN_PRIORITY 1
设置线程的优先级范围是1-10,设置其他值会抛出异常。
六、守护线程
守护线程就是除了用户线程之外的线程,是为了“守护”其他线程,其他线程结束后,守护线程可以不必执行完成而提前终止,可以提高效率。
通过setDaemon(boolean)可以设置该线程是否为守护线程,默认为false。