Java 语言的 JVM 允许运行多个线程,它通过 java . lang . Thread 类来体现。
目录
多线程的创建方式一:继承Thread类
每个线程都是通过某个特定的 Thread 对象的 run()方法来完成操作的,经常把 run()方法的主体称为线程体
通过该 Thread 对象的 start()方法来启动这个线程,而非直接调用 run()
//1. 创建一个继承于 Thread 类的子类
class Test extends Thread{
//2. 重写 Thread 类的 run()
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
public class myTest{
public static void main(String[] args) {
//3. 创建 Thread 类的子类的对象
Test t = new Test();
//4. 通过此对象调用 start():启动当前线程,调用当前线程的 run()
t.start();
//5. 再启动一个线程,不可以让已经 start() 的线程去执行,需要再创建一个线程对象
Test t1 = new Test();
t1.start();
}
}
>>> Thread-0:0
......
Thread-0:98
注:我们不能通过直接调用 run()的方式启动分线程,因为此时启动的是(main)主线程
多线程的创建方式二:实现Runnable接口
开发中优先选择 Runnable 接口方式
1. 实现的方式没有类的单继承性
2. 实现的方式更适合来处理多个线程有共享数据的情况
3. public class Thread implements Runnable
//1.创建一个实现了Runnable接口的类
class Test1 implements Runnable{
//Runnable 可以让多个线程共享数据,也就是所有线程的票总共100,而不是一个线程100,此前提是
//Test1只实例化一次
private int ticket = 100;
//2. 实现类去实现Runnable中的抽象方法 run()
@Override
public void run() {
while(true){
if (ticket > 0){
System.out.println(Thread.currentThread().getName() + "号码是:" + ticket);
ticket--;
}else {
break;
}
}
}
}
public class RunnableTest {
public static void main(String[] args) {
//3. 创建实现类的对象
Test1 test1 = new Test1();
//4. 将此对象作为参数传递到 Thread 类的构造器中,创建 Thread 类的对象
Thread t = new Thread(test1);
Thread t1 = new Thread(test1);
//5. 通过 Thread 类的对象调用 start()
t.start();
t1.start();
}
}
线程的常用方法
start() | 启动当前线程,调用当前线程的 run() |
run() | 通常需要重写 Thread 类中的此方法,将创建的线程要执行的操作声明在此方法中 |
currentThread() | 静态方法,返回执行当前代码的线程 |
getName() | 获取当前线程的名字 |
setName() | 设置当前线程的名字 |
yield() | 释放当前 cpu 的执行权 |
join() | 在线程 a 中调用线程 b 得 join(),此时线程 a 就进入阻塞状态,直到线程 b 完全执行完以后,线程 a 才结束阻塞状态 |
stop() | 当执行此方法时,强制结束当前线程 |
sleep(long millitime) | 让当前线程 “睡眠” 指定的 millitime 毫秒 |
isAlive() | 判断当前线程是否存活 |
线程优先级的设置
Java 中给出的优先级
MAX_PRIORITY = 10
MIN_PRIORITY = 1
NORM_PRIORITY = 5
如何获取和设置当前线程的优先级
getPriority():获取线程的优先级
setPriority(int p):设置线程的优先级
注:高优先级的线程要抢占低优先级线程 cpu 的执行权。但是只是从概率上讲,高优先级的线程高概率被执行。并不意味着只有当高优先级的线程执行完以后,低优先级的线程才执行
myTest t = new myTest();
t.setPriority(9); //将优先级设置为9
t.start();