程序:program,是一个静态概念;指令集
进程:process,是一个动态概念;由操作系统调度程序
线程:thread,是进程中一个“单一的连续控制流程”;在进程内多条执行路径;是一个轻量级的线程
(一)继承至Thread,重写run()方法
使用线程:
1. 创建子类对象
2. 调用start()方法,启动线程
以龟兔赛跑为例
1. 创建两个线程
public class Rabbit extends Thread{
@Override
public void run() {
for (int i = 1; i < 100; i++) {
System.out.println("兔子跑了" + i + "步");
}
}
}
class Tortoise extends Thread{
@Override
public void run() {
for (int i = 1; i < 100; i++) {
System.out.println("乌龟跑了" + i + "步");
}
}
}
2. 测试类
public class RabbitApp {
public static void main(String[] args) {
// 创建子类对象
Rabbit rabbit = new Rabbit();
Tortoise tortoise = new Tortoise();
//调用run方法
rabbit.start();
tortoise.start();
for (int i = 0; i < 100; i++) {
System.out.println("mian-->" + i);
}
}
}
3. 执行结果
在上面的程序中,共有三个线程:兔子线程,乌龟线程,main主线程
(二)实现Runnable接口,重写run方法
在这个地方会涉及到静态代理模式,感兴趣的可以去了解一下
使用线程:
1. 创建真实角色
2. 创建代理角色 + 真实对象的引用
3. 调用start()方法启动线程
模拟同时做两件事:聊qq,敲代码
1. 创建一个线程
public class Programmer implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("聊qq");
}
}
}
2. 测试,也是一个线程
public class ProgrammerApp {
public static void main(String[] args) {
// * 1.创建真实角色
Programmer pro = new Programmer();
// * 2.创建代理角色+真实角色引用
Thread proxy = new Thread(pro);
// * 3.调用start方法
proxy.start();
for (int i = 0; i < 100; i++) {
System.out.println("敲代码!");
}
}
}
3. 执行结果
推荐使用:
1. 避免单继承的局限性,类只能单继承,接口可以实现多继承
2. 便于共享资源
(三)实现Callable接口
如果想要在线程中返回值或者声明异常,就要使用到这种方式,因为前面两种方式不能返回值,也不能对外声明异常,但此方式不常用,且实现起来很繁琐。
使用线程:
1. 创建Callable实现类,重写call()方法
2. 借助执行调度服务ExecutorService,获取Future对象
3. 获取值
4. 停止服务
模拟获取一个线程的返回值
public class Cal implements Callable<Integer> {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 创建线程
ExecutorService ser = Executors.newFixedThreadPool(1);
Race tortoise = new Race();
// 获取值
Future<Integer> result = ser.submit(tortoise);
int num = result.get();
System.out.println(num);
// 停止服务
ser.shutdownNow();
}
@Override
public Integer call() throws Exception {
return 1000;
}
}
class Race implements Callable<Integer> {
@Override
public Integer call() throws Exception {
return 100;
}
}
执行结果