ToB企服应用市场:ToB评测及商务社交产业平台

标题: 第8章 多线程 [打印本页]

作者: 水军大提督    时间: 2023-4-22 21:29
标题: 第8章 多线程
8.1 线程简介

1 、多任务
2、多线程
3、程序、进程、线程
8.2 线程创建

8.2.1 Thread类

8.2.2 Runnable

8.2.3 实现Callable接口

8.3 lamda表达式和静态代理模式

8.3.1 lamda表达式

8.3.2 静态代理模式

8.4 线程状态



8.4.1 停止线程

8.4.2 线程休眠

<ol  start=""><li >sleep(时间)指定当前线程阻塞的毫秒数;
<li >sleep存在异常InterruptedExcepiton;
<li >sleep时间到达后线程进入就绪状态;
<li >sleep可以模拟网络延迟,倒计时等
<li >每一个对象都有一个锁,sleep不会释放锁
<li >倒计时实例
  1. package Demo032;<br>​<br>/**<br> * @Author: H-YONG-8<br> * @DATA: 2023/4/21<br> * JavaSE<br> * 测试停止线程<br> * 注意死循环<br> */<br>public class TestStop implements Runnable{<br>​<br>    //1.设置一个标识位<br>    private boolean flag = true;<br>​<br>    //重写方法<br>    @Override<br>    public void run() {<br>        int i = 0;<br>        while (flag){<br>            System.out.println("线程正在运行"+i++);<br>        }<br>    }<br>​<br>    //2设置一个公开的方法,停止线程,转换标志位<br>    public void stop(){<br>        this.flag = false;<br>    }<br>​<br>    public static void main(String[] args) {<br>​<br>        TestStop testStop = new TestStop();<br>        new Thread(testStop).start();<br>​<br>        for (int i = 0; i < 1000; i++) {<br>            System.out.println("main"+i);<br>            if(i == 900){<br>                //调用stop方法,切换标志位,让线程停止<br>                testStop.stop();<br>                System.out.println("线程该停止了");<br>            }<br>        }<br>    }<br>}
复制代码
</ul>8.4.6 线程优先级

8.4.7 守护线程
8.5 线程同步

8.5.1 并发

8.5.2 线程同步

<ol  start=""><li >线程有自己的私有数据,比如栈和寄存器,同时与其它线程共享相同的虚拟内存和全局变量等资源。 在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程。但是当多个线程同时读写同一份共享资源的时候,会引起冲突,例如在多个线程同时对同一个内存地址进行写入,由于CPU时间调度上的问题,写入数据会被多次的覆盖,所以就要使线程同步。这时候就需要引入线程同步机制使各个线程排队一个一个的对共享资源进行操作,而不是同时进行。
<li >简单的说就是,在多线程编程里面,一些数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。
<li >处理多线程问题时,多线程访问同一个对象,并且某些线程还想修改这个对象。这个时候我们就需要线程同步。
<li >线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成对列,等待前面线程使用完毕,下一个线程再使用。
<li >由于同一进程的多个线程共享一块存储空间,在方便的同时,也带来了访问冲突,为了保证数据在方法中被访问时的正确性,再访问时加入锁机制,当一个线程获得对象的排他锁,多占资源,其他线程必须等待,使用后释放锁即可。
<li >线程不安全案例
  1. package Demo032;<br>​<br>/**<br> * @Author: H-YONG-8<br> * @DATA: 2023/4/21<br> * JavaSE<br> * 礼让线程<br> */<br>public class TestYield {<br>​<br>    public static void main(String[] args) {<br>        MyYield myYield = new MyYield();<br>        new Thread(myYield,"a").start();<br>        new Thread(myYield,"b").start();<br>​<br>    }<br>}<br>​<br>class MyYield implements Runnable{<br>    @Override<br>    public void run() {<br>        System.out.println(Thread.currentThread().getName()+"线程开始执行");<br>        Thread.yield();//礼让<br>        System.out.println(Thread.currentThread().getName()+"线程停止执行");<br>    }<br>}
复制代码
 
</ul> 
 
8.6 线程通信问题


 




<ul  data-mark="+"><li >实例
[code]/**
* 测试:生产者消费者模型-->利用缓冲区解决:管程法
*/
public class Demo33_ThreadPC {
   public static void main(String[] args) {
       SynContainer synContainer = new SynContainer();
       new Producer(synContainer).start();
       new Consumer(synContainer).start();
   }
}

//生产者
class Producer extends Thread {
   //容缓冲区
   SynContainer container;

   public Producer(SynContainer container) {
       this.container = container;
   }

   //生产
   @Override
   public void run() {
       for (int i = 0; i < 100; i++) {
           container.push(new Product(i));
           System.out.println("生产了" + i + "件产品");
       }
   }
}

//消费者
class Consumer extends Thread {
   //容缓冲区
   SynContainer container;

   public Consumer(SynContainer container) {
       this.container = container;
   }

   //消费
   @Override
   public void run() {
       for (int i = 0; i < 100; i++) {
           System.out.println("消费了-->" + container.pop().id + "件产品");
       }
   }
}

//产品
class Product {
   int id;//产品编号

   public Product(int id) {
       this.id = id;
   }
}

//缓冲区
class SynContainer {
   //需要一个容器大小
   Product[] products = new Product[10];
   //容器计数器
   int count = 0;

   //生产者放入产品
   public synchronized void push(Product product) {
       //如果容器满了,需要等待消费者消费
       /*如果是if的话,假如消费者1消费了最后一个,这是index变成0此时释放锁被消费者2拿到而不是生产者拿到,这时消费者的wait是在if里所以它就直接去消费index-1下标越界,如果是while就会再去判断一下index得值是不是变成0了*/
       while (count == products.length) {
           //通知消费者消费,等待生产
           try {
               this.wait();
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
       //如果没有满,需要丢入产品
       products[count] = product;
       count++;
       //通知消费者消费
       this.notifyAll();
   }

   //消费者消费产品
   public synchronized Product pop() {
       //判断是否能消费
       while (count




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4