创建新线程
599字约2分钟
2024-08-08
Java
语言内置了多线程支持。当 Java
程序启动的时候,实际上是启动了一个 JVM
进程,然后,JVM
启动主线程来执行 main()
方法。在 main()
方法中,我们又可以启动其他线程
要创建一个新线程非常容易,我们需要实例化一个 Thread
实例,然后调用它的 start()
方法
public static void main(String[] args) {
Thread thread = new Thread();
// 启动新线程
thread.start();
}
但是这个线程启动后实际上什么也不做就立刻结束了。
创建线程
我们希望新线程能执行指定的代码,有以下几种方法
方法一:从Thread
派生一个自定义类,然后覆写run()
方法
public static void main(String[] args) {
Thread t = new MyThread();
// 启动新线程
t.start(); // MyThread run 起来
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread run 起来");
}
}
执行上述代码,注意到 start()
方法会在内部自动调用实例的 run()
方法
方法二:创建Thread
实例时,传入一个Runnable
实例
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
// 启动新线程
t.run(); // MyRunnable run 起来
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("MyRunnable run 起来");
}
}
或者用 Java8
引入的 lambda
语法进一步简写为
public static void main(String[] args) {
new Thread(() -> {
System.out.println("run 起来");
}).start(); // run 起来
}
方法三:实现 Callable
接口
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 3、创建目标对象
Thread t = new Thread();
// 4、创建执行服务(有四种,这里创建的是固定大小线程池)
ExecutorService es = Executors.newFixedThreadPool(1);
// 5、提交执行
Future<String> result = (Future<String>) es.submit(t);
// 6、获取结果
String res = result.get();
// 7、关闭服务
es.shutdownNow();
}
// 1、实现 Callable 接口,需要返回值类型
class MyCallable implements Callable<String> {
// 2、重写 call 方法
@Override
public String call() throws Exception {
String str = "MyCallable Run 起来";
return str;
}
}
相较于另外两种方式
可以定义返回值
可以抛出异常
线程的优先级
可以对线程设定优先级,设定优先级的方法是
Thread.setPriority(int n) // 1~10, 默认值5
优先级高的线程被操作系统调度的优先级较高,操作系统对高优先级线程可能调度更频繁,但我们决不能通过设置优先级来确保高优先级的线程一定会先执行