ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JavaEE 初阶 多线程 1

JavaEE 初阶 多线程 1 目录进程进程/任务Prcess/Task进程控制块抽象(PCB ProcessControlBlock)进程间通信(InterProcessCommunication)线程使用操作系统提供的api创建线程中断线程进程探讨线程之前先来了解一下进程进程/任务Prcess/Task每个应⽤程序运⾏于现代操作系统之上时操作系统会提供⼀种抽象好像系统上只有这个程序在运 ⾏所有的硬件资源都被这个程序在使⽤。这种假象是通过抽象了⼀个进程的概念来完成的。进程是操作系统进⾏资源分配的基本单位。进程控制块抽象(PCB ProcessControlBlock)包含进程的各种属性核心属性1.PID 进程的标识符唯一不重复2.内存指针一个进程的内存中包含指令和数据内存指针指明哪部分是数据那部分是指针3.文件描述符进程需要对文件进行读写进程控制块pcb中存储一系列结构体描述了文件的具体信息4.进程的状态大致分为就绪和阻塞5.进程的优先级机器的硬件资源有限需要多个进程进行调度使用高优先级有限使用资源6.进程的上下文进程在使用过程中中断需记录位置返回该进程从记录处开始7.进程的记账信息记录每个进程在系统上的运行时间进程间通信(InterProcessCommunication)⽬前主流操作系统提供的进程通信机制有如下1. 管道 2. 共享内存 3. ⽂件 4. ⽹络 5. 信号量 6. 信号由于对进程频繁开启关闭消耗大量资源引出轻量级的线程线程⼀个线程就是⼀个执⾏流.每个线程之间都可以按照顺序执⾏⾃⼰的代码.多个线程之间同时执⾏ 着多份代码。线程中包含tgid不同的线程拥有同一个tgid表示属于同一进程。线程是操作系统进行调度的基本单位。线程分前台线程和后台线程进程中包含前台线程和后台线程前台线程占主动话语权当前台线程关闭时会导致整个进程关闭后台进程关闭不会影响进程的状态。使用操作系统提供的api创建线程一个thread对象唯一对应一个线程方法11.重写Thread中的run方法class Mythread extends Thread { Override public void run() { System.out.println(hello world); } }2.调用start创建线程间接调用run方法//法1 //引出对象 Thread tnew Mythread(); //创建新线程 t.start(); System.out.println(hello bit);*/ //法2 匿名内部类 Thread tnew Thread(){ Override public void run() { System.out.println(111); } }; t.start();方法2实现Runnable接口/给出一个逻辑具体进程线程用不关心 class Myrunnble implements Runnable{ Override public void run() { System.out.println(hello world); } }创建Thread类实例,调⽤Thread的构造⽅法时将Runnable对象作为target参数//法1 低耦合 Runnable rnew Myrunnble(); Thread tnew Thread(r); t.start(); //法2 匿名类 低耦合 Thread tnew Thread(new Runnable() { Override public void run() { System.out.println(222); } }); t.start();使用lambda表达式Thread tnew Thread(()-{ //使用Runnable 匿名函数run System.out.println(222); try { Thread.sleep(100); } catch (InterruptedException e) { throw new RuntimeException(e); } },t1); t.start();中断线程方法1使用标志位running决定线程t 是否继续运行注此次lambda中获取外部变量通过变量捕获的方式即将外部变量拷贝一份到表达式内且该变量在表达式内不能被改变public class demo1 { # 使用全局变量running public static boolean runningtrue; public static void main(String[] args) { # boolean runningtrue; false方式 Thread tnew Thread(()-{ while (running){ System.out.println(hello thread); try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } System.out.println(Thread 退出); }); t.start(); Scanner snew Scanner(System.in); System.out.println(请 input); int ns.nextInt(); if (n0){ runningfalse; } } }方法2使用thread的内部标志位Thread tnew Thread(()- { while (!Thread.currentThread().isInterrupted()) { System.out.println(hello thread); #为防止陷入阻塞 t.interrupted()可以使阻塞线程唤醒 try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } } }); t.start(); //设置内部变量为false t.interrupt();
返回列表