多线程的学习(1)
线程的创建方式
1.继承Thread类
package duoXianCheng;public class MyThread extends Thread{public void run(){System.out.println("hoh");}public static void main(String[] args) {MyThread m1 = new MyThread();m1.start();//start启动线程,调用重写的run方法}
}
2.实现Runnable接口
package duoXianCheng;public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Hello World");}public static void main(String[] args) {Runnable runnable = new MyRunnable();Thread thread = new Thread(runnable);//创建Thread对象,将runnable对象传入构造方法中thread.start();}
}
3.实现Callable接口
package duoXianCheng;import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {return 0;}public static void main(String[] args) {FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyCallable());new Thread(futureTask).start();//}
}
Thread,Callable,Runnable的区别:
- Thread:
- 是 Java 中用于表示线程的类。它直接继承自 Object 类,并实现了 Runnable 接口。
- 可以直接创建一个 Thread 对象来启动一个新线程,在新线程中执行特定的任务。
- Runnable:
- 是一个接口,只有一个抽象方法
run()
。 - 实现了 Runnable 接口的类必须实现
run()
方法,用于定义线程要执行的任务。通常将 Runnable 实例作为参数传递给 Thread 构造函数来创建新线程并执行该任务。
- 是一个接口,只有一个抽象方法
- Callable:
- 也是一个接口,它与 Runnable 类似,但有一个不同之处在于它的
call()
方法可以返回一个结果并且可以抛出异常。 - 通常与
FutureTask
结合使用,用于需要有返回值的异步任务。
- 也是一个接口,它与 Runnable 类似,但有一个不同之处在于它的
线程的优先级:
package duoXianCheng;public class youXianJi {public static void main(String[] args) {// 创建两个线程,一个优先级高,一个优先级低Thread lowPriorityThread = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("低优先级线程在运行:" + i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}});lowPriorityThread.setPriority(2);Thread highPriorityThread = new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("高优先级线程在运行:" + i);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}});highPriorityThread.setPriority(9);lowPriorityThread.start();highPriorityThread.start();}
}
线程调度
两种调度方式
1、分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
2、抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
Java使用的是抢占式调度模型、随机性
假如计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。
所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权是不一定的
设置和获取优先级
final int getPriority() 返回此线程的优先级
final void setPriority(int newPriority) 更改此线程的优先级线程默认优先级是5;线程优先级的范围是:1-10