Java多线程01
多线程
1. 进程与线程
1.1 进程
操作系统中最小的单位,通过进程可以创建程序的应用。
1.2 线程
线程是进程中最小单位,一个进程中可以包含多个多线程,并且可以同时执行,此时就形成了多线程状态。
1.3 并发与并行
并发:是指两个队列交替的在一台咖啡机上接咖啡
并行:是指两个队列在两台咖啡机排队接咖啡
串行:只有一个队列,排队一个个接咖啡
2. 自定义线程实现方式
2.1 继承Thread类
public Numshuffle extends Thread {
//重写run方法
public void run() {
}
}
main
Numshuffle numshuffle = new Numshuffle();
//启动线程
numshuffle.start();
- 优点:继承方式,优点明显,编程方式比较简单,直接就可以进行调用。
- 缺点:单继承,所以希望扩展时困难。
2.2 实现Runnable接口
public Numshuffle implements Runnable {
//重写run方法
public void run() {
}
}
main
Numshuffle numshuffle = new Numshuffle();
Thread t1 = new Thread(numshuffle);
//启动线程
t1.start();
- 优点:先将线程类进行实例化,再利用Thread实现线程的调用,稍显复杂。
- 更高灵活度,可以实现继承的同时,还可以实现多接口。
- 可以实现任务共享机制。
2.3 run方法调用和start调用的区别
run方法时定义再线程类中,作为自定义线程,需要重写run方法,如果直接通过main主线程调用,就和调用普通的对象方法时一样的,并不会让线程单独启动。而start方法是定义在Thread类中的,通过start方法,jvm虚拟机会自动的调用run方法,执行线程任务,所以该种方式是能够实现多线程的方式。一个线程不能够重复执行。
3. 线程调度
方法 | 说明 |
---|---|
setPriority(int newPriority) | 更改线程的优先级 |
static void sleep(long millis) | 在指定的毫秒数内让当前正在执行的线程休眠 |
void join( ) | 等待该线程终止 |
static void yield( ) | 暂停当前正在执行的线程对象,并执行其他线程 |
void interrupt( ) | 中断线程 |
boolean isAlive( ) | 测试线程是否处于活动状态 |
3.1 setPriority
更改线程的优先级,优先级是从1~10设置,默认是5。
Thread thread = new Thread(tr,"线程优先级高");
//设置线程的优先级
thread.setPriority(10);
System.out.println(thread.getPriority());
thread.start;
3.2 sleep
能够让当前线程进如休眠状态,通过毫秒的参数进行设定。
public class TestThreadSleep {
public static void main(String[] args) throws InterruptedException {
//匿名内部类启动线程
new Thread(new Runnable() {
@Override
public void run() {
//让线程睡眠3秒钟,注意:此处的时间是按照毫秒计算的。所以1秒等于1000毫秒
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//打印当前线程的名字和id号
Thread thread = Thread.currentThread();
System.out.println(thread.getName() + " ==> " + thread.getId());
}
}).start();
Thread.sleep(5000);//让主线程睡眠5秒
Thread thread1 = Thread.currentThread();
System.out.println(thread1.getName() + " ==> " + thread1.getId());
}
}
3.3 join
让一条线程强制插入到正在运行的线程过程中,在执行后,再让出执行权。
public void sleep() {
while(true) {
//每秒睡一次
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Date date = new Date();
System.out.println(date);
}
}
main:
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getNmae() + "=" + i);
if(i == 5) {
try {
st.join();//强势性,插入执行后,其他线程全部等待
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}