程序是静态的,当它跑起来是就是一个进程,进程中通常会有多个线程。(默认线程就有main线程(用户线程)和 gc线程(守护线程))
线程的三种创建方式:

一、第一种方式:继承Thread类
/*通过继承Thread类,定义一个乌龟线程
1.定义线程类:继承Thread类,重写run()方法
public class TortoiseThread extends Thread{
public void run() {}
}
2.创建线程对象:
Thread thread1= new TortoiseThread();
3.启动新线程
thread1.start();
*** 4.启动main方法,自动创建main方法
*** 5.Thread类的常用方法
run()
thread1.setName("乌龟线程1")
this.setPriority(MAX_PRIORITY)
thread1.start();
Thread.currentThread().getName()
Thread.currentThread().getPriority()
*/
二、第二种方式:实现Runnable接口
/*通过实现Runnable接口,定义一个乌龟线程
方法2实现Runnable接口创建线程
1.定义线程类
class TortoiseRunnable implements Runnable{
public void run() {}
}
2.创建线程对象
Runnable runnable = new TortoiseRunnable();
Thread thread1 = new Thread(runnable);
3.启动线程
thread1.start();
*/
代码:

3.两种方法比较:
继承Thread类创建线程:
优点:编程简单
缺点:单继承,无法再继承其他类
实现Runnable接口创建线程:
优点:1.利用接口可以继承其他类,实现多继承
2. 便于多个线程共享同一个资源(多个线程同时调用runnable接口)
缺点:稍微繁琐
4.第三种方式:实现Callable接口
JDK1.5后推出了第三种定义线程的方式,实现Callable接口
与实行Runnable相比, Callable功能更强大些
-
- 可以有返回值,支持泛型的返回值
- 可以抛出检查异常
- 需要借助FutureTask,比如获取返回结果
总结:
/*
通过实现Runnable接口,定义一个随机数线程
1.定义一个能返回10以内的整数的 Callable接口
public class RandomCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
Thread.sleep(3000);//线程停顿三秒
return new Random().nextInt(10);
}
}
2.创建一个线程
Callable<Integer> callable = new RandomCallable();
FutureTask<Integer> task = new FutureTask(callable); //利用FutureTask实现Callable接口
Thread thread = new Thread(task);//通过task启动线程
3.启动线程
thread.start();
4.获取返回值
int result = task.get();//得不到返回值就一直等待
int result1 = task.get(1000, TimeUnit.MILLISECONDS);//等待一秒,没有得到值就输出异常
*/
代码:

本文详细介绍了Java中创建线程的三种方式:继承Thread类、实现Runnable接口以及实现Callable接口。对比了它们的优缺点,强调了实现Runnable接口在多继承和资源共享方面的优势,而Callable接口则支持有返回值和抛出异常的功能。
2197

被折叠的 条评论
为什么被折叠?



