程序是静态的,当它跑起来是就是一个进程,进程中通常会有多个线程。(默认线程就有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);//等待一秒,没有得到值就输出异常
*/
代码: