目录标题
- 多线程简介
- 多任务
- 进程
- 什么是线程
- 什么是多线程
- 线程创建的方法(重点)
- 练习一
- 创建线程的方法一: 继承Thread类 重写run()方法 调用start方法开启线程
- //重点: 调用 start方法时 是同时运行的 // 重点:(当你运行的东西比较少时 不容易观察出来是同时运行的) // (可以将for循环改为 两千来调用试试) // for (int i = 0; i < 2000; i++) { } //而调用 run 方法时 是由先后顺序决定的 //调用start方法时 main方法 和线程中start方法是同时运行的(交替执行) //重点: 当两个方法同时运行的 线程不一定同时运行 (而是看cpu调度安排) TestThread1 testThread1 = new TestThread1(); testThread1.start(); //testThread1.run();
- 练习二
- 练习 Thread 实现多线程同步下载图片
- 练习三
- 创建线程的第二种方式(实现Runnable接口)
- 重点: //创建线程方式二: 实现runnable接口 重写run方法 // 执行线程需要丢入runnable接口实现类 调用start方法
- //创建runnable接口的实现类对象 TestThread3 testThread3 = new TestThread3();
- //创建线程对象 通过线程对象来开启我们的线程(代理功能) Thread thread = new Thread(testThread3); thread.start(); //new Thread(testThread3).start();//意思为上面两行代码的简写
- 重点总结: 继承Thread类 时只有一份资源 实现Runnable接口 时一份资源但多个代理 原因推荐使用实现Runnable接口创建线程 因为面向对象(oop)继承类的具有局限性 使用不方便灵活 因为Java的类只有单继承 extends 而接口可以多继承 方便灵活实现接口
- 因为Java是单继承 所以推荐使用Runnable接口
- 创建多线程练习
- 案例一 龟兔赛跑
- //创建胜利者 //重点 //static 保证只有一个冠军winner //因为:静态变量不属于对象 (static只执行一次) //加入static 保证了冠军的唯一性 private static String winner;
- //判断是否完成比赛 //重点:参考 顺序结构和选择结构详解 //复习:1 当一个if语句中由最多只能有一个else语句 而且else语句种必须在所有的else if语句之后 // 2 if语句中可以有若干个else if语句 而且它们必须在else语句之前 一旦其中一个else if语句中 检测结果为true 其他的else if //以及else语句都将跳过执行 //3 return的意思为结束方法和返回一个结果 //4 方法的调用(复习)如果方法有返回值时则写出返回值类型 如 int类型 byte等类型 //如果方法没有返回值则用void 而且如果方法返回值是void //那么方法调用的一定是一条语句 private boolean gameOver(int steps){ if ((winner != null)) { //已经存在胜利者 return true; }else { if (steps>=100){ winner=Thread.currentThread().getName(); System.out.println("winner is"+winner); return true; } } return false; }
- 实现Callable接口(了解即可)
- 线程的创建方法三:实现Callable接口
- 重要四步骤
- //创建执行服务 ExecutorService ser = Executors.newFixedThreadPool(3);
- //提交执行 Future r1=ser.submit(t1); Future r2=ser.submit(t2); Future r3=ser.submit(t3);
- //获取结果 boolean rs1=r1.get(); boolean rs2=r2.get(); boolean rs3=r3.get();
- //打印返回值 System.out.println(rs1); System.out.println(rs2); System.out.println(rs3);
- //关闭服务 ser.shutdown();
- 实现 Callable接口创建线程的好处 1 可以定义返回值(Boolean 等类型) 2 可以抛出异常
多线程简介

多任务
先来了解一下多任务

进程
process 进程
Thread 线程
在下面的图片中我们可以看到:当视频(进程process)开始播放的时候
可以看到 听到 声音和图像 字幕 这些线程(Thread)是同时进行的

process和Thread的区别

什么是线程
Thread 线程
线程就是CPU调度和执行的单位
通常一个进程中包含若干个线程

什么是多线程

普通方法调用和多线程调用的例子(重点)

线程创建的方法(重点)



练习一
创建线程的方法一: 继承Thread类 重写run()方法 调用start方法开启线程
//重点: 调用 start方法时 是同时运行的
// 重点:(当你运行的东西比较少时 不容易观察出来是同时运行的)
// (可以将for循环改为 两千来调用试试)
// for (int i = 0; i < 2000; i++) { }
//而调用 run 方法时 是由先后顺序决定的
//调用start方法时 main方法 和线程中start方法是同时运行的(交替执行)
//重点: 当两个方法同时运行的 线程不一定同时运行 (而是看cpu调度安排)
TestThread1 testThread1 = new TestThread1();
testThread1.start();
//testThread1.run();

理解代码图片

练习二
练习 Thread 实现多线程同步下载图片

练习三
创建线程的第二种方式(实现Runnable接口)

重点:
//创建线程方式二: 实现runnable接口 重写run方法
// 执行线程需要丢入runnable接口实现类 调用start方法
//创建runnable接口的实现类对象
TestThread3 testThread3 = new TestThread3();
//创建线程对象 通过线程对象来开启我们的线程(代理功能)
Thread thread = new Thread(testThread3);
thread.start();
//new Thread(testThread3).start();//意思为上面两行代码的简写

重点总结:
继承Thread类 时只有一份资源
实现Runnable接口 时一份资源但多个代理
原因推荐使用实现Runnable接口创建线程
因为面向对象(oop)继承类的具有局限性 使用不方便灵活
因为Java的类只有单继承 extends 而接口可以多继承 方便灵活实现接口

实现Runnable接口和继承Thread类的区别:
因为Java是单继承 所以推荐使用Runnable接口

创建多线程练习
练习 多个线程同时操作同一个对象 买火车票的例子
发现问题:多个线程操作一个资源的情况下 线程不安全 数据紊乱
重点
System.out.println(Thread.currentThread().getName()+“–>拿到了第”+ticketNums–+“票”);

案例一 龟兔赛跑

//创建胜利者
//重点
//static 保证只有一个冠军winner
//因为:静态变量不属于对象 (static只执行一次)
//加入static 保证了冠军的唯一性
private static String winner;
//判断是否完成比赛
//重点:参考 顺序结构和选择结构详解
//复习:1 当一个if语句中由最多只能有一个else语句 而且else语句种必须在所有的else if语句之后
// 2 if语句中可以有若干个else if语句 而且它们必须在else语句之前 一旦其中一个else if语句中 检测结果为true 其他的else if
//以及else语句都将跳过执行
//3 return的意思为结束方法和返回一个结果
//4 方法的调用(复习)如果方法有返回值时则写出返回值类型 如 int类型 byte等类型
//如果方法没有返回值则用void 而且如果方法返回值是void
//那么方法调用的一定是一条语句
private boolean gameOver(int steps){
if ((winner != null)) {
//已经存在胜利者
return true;
}else {
if (steps>=100){
winner=Thread.currentThread().getName();
System.out.println(“winner is”+winner);
return true;
}
}
return false;
}

实现Callable接口(了解即可)
线程的创建方法三:实现Callable接口

重要四步骤
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
Future r1=ser.submit(t1);
Future r2=ser.submit(t2);
Future r3=ser.submit(t3);
//获取结果
boolean rs1=r1.get();
boolean rs2=r2.get();
boolean rs3=r3.get();
//打印返回值
System.out.println(rs1);
System.out.println(rs2);
System.out.println(rs3);
//关闭服务
ser.shutdown();
实现 Callable接口创建线程的好处
1 可以定义返回值(Boolean 等类型)
2 可以抛出异常


本文详细介绍了Java中的多线程概念,包括进程与线程的区别、线程的创建与执行,以及线程同步问题。通过实例演示了继承Thread类和实现Runnable接口两种创建线程的方式,并讨论了它们的优缺点。此外,还提到了Callable接口的使用,以及多线程在实际问题中如买火车票和龟兔赛跑案例的应用。最后,文章强调了线程安全和资源管理的重要性。
5万+

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



