本文共 2160 字,大约阅读时间需要 7 分钟。
程序: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{ public static void main(String[] args) throws InterruptedException, ExecutionException { // 创建线程 ExecutorService ser = Executors.newFixedThreadPool(1); Race tortoise = new Race(); // 获取值 Future 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 { @Override public Integer call() throws Exception { return 100; }}
执行结果