菏泽去哪了做网站,wordpress 文章模块,淘宝seo搜索优化,外卖平台app开发多少钱文章目录 线程是什么#xff1f;1.1概念1.1.1 线程是什么#xff1f;1.1.2 为什么要有线程1.1.3 进程和线程的区别1.1.4 思考#xff1a;执行一个任务#xff0c;是不是创建的线程或者越多是不是越好#xff1f;#xff08;比如吃包子比赛#xff09;1.1.5 ) Java 的线程… 文章目录 线程是什么1.1概念1.1.1 线程是什么1.1.2 为什么要有线程1.1.3 进程和线程的区别1.1.4 思考执行一个任务是不是创建的线程或者越多是不是越好比如吃包子比赛1.1.5 ) Java 的线程 和 操作系统线程 的关系 1.2 对多线程程序的理解1.2.1 ) Java 的线程 和 操作系统线程 的关系 1.3 创建线程的两种方式1.3.1 继承 Thread 类1.3.2实现Runnable接口1.3.3两者创建方法的对比1.3.4 其他形式创建1.3.4.1 匿名类创建Thread子类对象1.3.4.2匿名内部类创建 Runnable ⼦类对象1.3.4.2 lambda 表达式创建 Runnable ⼦类对象 1.4 jconsloe使用 线程是什么
1.1概念
1.1.1 线程是什么
线程是就是一个执行流每个执行流之间都可以按照一定顺子执行自己的代码多个线程可以”同时“执行多分代码举例进程就像一个程序比如qq迅雷进程是程序的一次执行过程或者是正在运行的一个程序是动态的过程有它自己的产生存在和消亡的过程线程是又进程创建的是进程的一个实体一个进程可以拥有多个线程把迅雷比作一个进程而同时下载多条视频就是多条线程在工作。
1.1.2 为什么要有线程
“并发式编成”已经成为了编成界的“刚需”单核 CPU 的发展遇到了瓶颈. 要想提⾼算⼒, 就需要多核 CPU. ⽽并发编程能更充分利⽤多核 CPU资源.有些任务场景需要 “等待 IO”, 为了让等待 IO 的时间能够去做⼀些其他的⼯作, 也需要⽤到并发编程.重点进程虽然可以进程并发编成但是线程比进程更轻量。 解释进程的创建也需要申请资源而申请资源对于系统的性能影响比较大。 举个例子张三要开一个工厂工业园相当于是操作系统地皮是固定的张三的工厂就像一个进程生产线就像一个线程张三的工厂是生产皮包的里面只有一条生产线现在我们要提高产量是重新建一个场比较好还是在原来的工厂中加一条生产线好呢肯定是只增加一条生产线这样就节省了工业园地皮的面积资源也利用张三工厂的面积资源线程的出现更好的利用了系统的资源。 其次, 虽然多进程也能实现 并发编程, 但是线程⽐进程更轻量 创建线程比创建进程更快 销毁线程比销毁进程更快 调度线程比调度进程更快。 线程虽然比进程更轻量但是⼈们还不满⾜, 于是⼜有了 “线程池”(ThreadPool) 和 “协程”(Coroutine)
1.1.3 进程和线程的区别 1.进程里面包含线程每一个进程里面至少包含一个主线程 2.进程是申请资源的最小单位 3.线程是cpu调度的最小单位 4.进程和进程之间不共享内存空间. 同⼀个进程的线程之间共享同⼀个内存空间 所以进程与进程之间互不影响线程与线程之间可能产生影响 5.一个线程受到影响会导致进程的结束⼀个进程挂了⼀般不会影响到其他进程. 但6.是⼀个线程挂了, 可能把同进程内的其他线程⼀起带⾛(整个进程崩溃). 1.1.4 思考执行一个任务是不是创建的线程或者越多是不是越好比如吃包子比赛 我们先思考下创造进程的方式 虽然双进程比单进程确实提升了效率但是消耗资源太大了太浪费资源了 我们思考创建线程的方法 效率确实提高了比进程消耗的资源小 我们再思考一下根据上面的情况我们无限创建线程是不是线程创建的越多越好呢 答案肯定不是的这样会出现线程争抢资源问题如果一个线程崩溃就会造成整个进程的崩溃 其实我们可以根据cpu的逻辑处理器来创建线程 当线程小于逻辑处理器创建线程会提升效率 当线程大于逻辑处理器创建线程的线程都是阻塞等待状态从而没有发挥出线程的效果创建线程本来就会消耗资源从而白白消耗资源 总结通过提升线程我们可以提高效率但是要根据实际情况来创建不能盲目创建
1.1.5 ) Java 的线程 和 操作系统线程 的关系
线程是操作系统中的概念. 操作系统内核实现了线程这样的机制, 并且对⽤⼾层提供了⼀些 API 供⽤⼾使⽤(例如 Linux 的 pthread 库).Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进⾏了进⼀步的抽象和封装.
1.2 对多线程程序的理解
1.2.1 ) Java 的线程 和 操作系统线程 的关系
线程是操作系统中的概念. 操作系统内核实现了线程这样的机制, 并且对⽤⼾层提供了⼀些 API 供⽤⼾使⽤(例如 Linux 的 pthread 库).Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进⾏了进⼀步的抽象和封装.线程与普通程序的区别每个线程都是⼀个独⽴的执⾏流多个线程之间是 “并发” 执⾏的 import java.util.Random; public class ThreadDemo {private static class MyThread extends Thread {Overridepublic void run() {Random random new Random();while (true) {// 打印线程名称System.out.println(Thread.currentThread().getName());try {// 随机停⽌运⾏ 0-9 秒Thread.sleep(random.nextInt(10));} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {MyThread t1 new MyThread();t1.start();Random random new Random();while (true) {// 打印线程名称System.out.println(Thread.currentThread().getName());try {Thread.sleep(random.nextInt(10));} catch (InterruptedException e) {// 随机停⽌运⾏ 0-9 秒e.printStackTrace();}}} } 我们可以jconsole这个工具查看线程 里面有一个mian主线程和Thread-0子线程 1.3 创建线程的两种方式
1.3.1 继承 Thread 类 Override//自定义的线程的执行体线程执行的代码写在这里public void run(){while (true){System.out.println(hello myThread );try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}} } class Main{public static void main(String[] args) {MyThread myThreadnew MyThread();//创建一个线程对象myThread.start();//启动线程while (true){System.out.println(hello mainThread);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}1PCB是操作系统层面的 2Thread是java层面的线程。两者是一 一对应的 3过程java创建一个线程------jvm调用系统API--------创建系统中线程------参与调度cpu 4. 线程执行的顺序是没有规律的跟cpu的调度有关因为cpu是“抢占式”执行所以那个线程当前占用cpu资源是不能确定的 5.能不能调用run方法执行线程答案是不行的因为run方法是java层面的是不能启动线程的。 6: start开始后并不意味着线程立马执行 1.3.2实现Runnable接口 Overridepublic void run() {while (true){System.out.println(hello myRunnable);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}} class Main{public static void main(String[] args) {MyRunnable myRunnablenew MyRunnable();//创建一个线程任务对象// 创建 Thread 类实例, 调⽤ Thread 的构造⽅法时将 Runnable 对象作为 target 参数.Thread threadnew Thread(myRunnable);//创建一个线程对象thread.start();//启动线程while (true){System.out.println(hello mainThread);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}} } 这种方法实现底层原码过程 其实这种模式是一种及简化的代理模式这里模拟实现一下 //模拟实现一个Thread类的代理类模拟Thread的启动
public class ThreadProxy implements Runnable{private Runnable target;public ThreadProxy(Runnable target) {this.target target;}Overridepublic void run(){if (target!null){target.run();}}public void start(){start0();}private void start0() {run();}}
class Main{public static void main(String[] args) {
// ThreadProxy threadProxy01 new ThreadProxy(new Runnable() {
// Override
// public void run() {
// while (true){
// System.out.println(hello myRunnable);
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }
// });
// threadProxy01.start();Tiger tiger new Tiger();ThreadProxy threadProxy02 new ThreadProxy(tiger);threadProxy02.start();}
}
class animal {
}
class Tiger extends animal implements Runnable{public void run(){System.out.println(老虎嗷嗷叫);}
}1.3.3两者创建方法的对比 继承 Thread 类, 直接使⽤ this 就表⽰当前线程对象的引⽤.实现 Runnable 接⼝, this 表⽰的是 MyRunnable 的引⽤. 需要使⽤Thread.currentThread()java是单继承模式在某种情况下一个类可能已经继承某个父类这时在用来继承Thread类的方法创造线程是显然不可能的实现 Runnable 接⼝,实现了高内聚低耦合的特点线程和业务逻辑分开后面修改代码时候相互影响最小化。 解释举例一个场景两条生成皮鞋的生产线一条生产皮包生产线 1.3.4 其他形式创建
1.3.4.1 匿名类创建Thread子类对象
public class Main {public static void main(String[] args) {Thread t1new Thread(){Overridepublic void run() {while (true){System.out.println(hello myThread);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}};t1.start();}}1.3.4.2匿名内部类创建 Runnable ⼦类对象
public class Main {public static void main(String[] args) {Thread t2new Thread(new Runnable(){Overridepublic void run() {while (true){System.out.println(hello myRunnable);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}});t2.start();}
}
1.3.4.2 lambda 表达式创建 Runnable ⼦类对象
public class Main {public static void main(String[] args) {Thread t3new Thread(()-{while (true){System.out.println(hello myLambda);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t3.start();}}1.4 jconsloe使用 我们这里重提一下先调用的方法会先入栈后调用的后入栈后调用的方法执行完后就会出栈。