• 线程、多线程同步、线程之间的通信


    多线程,可以这样理解:

    读一本书为一个线程,听一首歌为一个线程。当我们同时做这两件事的时候,要么听了歌曲,读完了书却不记得读了什么,或者读了书,却没有记住歌曲听的是什么。

    CPU可以比作是大脑,读书和听音乐都是线程,每次CPU都只能执行一个线程,执行完一个线程才会执行下一个线程

    Java中主要提供了两种方式实现线程:分别为继承java.lang.Therad类 和实现 java.lang.Runnable接口

    Therad类:

    为了方便查看   我将两个个类中的东西都写到了一起,中间用*******隔开的

    package com.maya.Test;
    
    public class MaYi extends Thread {
    
        private String name;         //成员变量
    
        public MaYi(String name){        //构造函数
            this.name=name;        
        }
        
        public void run(){                //run方法  线程执行的内容要写在这里面
            
            while(true){
            
                    try {
                        Thread.sleep(2000);                        //延迟2000毫秒
                    } 
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                
            System.out.println(this.name+"蚂蚁正在下载");
            
            }
            
        }
    }
    
    
    ********************************************************************************************************
    
    package com.maya.Test;
    
    public class Test {
    
        public static void main(String [] args){
            
            MaYi my1=new MaYi("蚂蚁一号");            //造新的线程
            my1.start();
            
            MaYi my2=new MaYi("蚂蚁二号");
            my2.start();
            
            MaYi my3=new MaYi("蚂蚁三号");
            my3.start();
            
            MaYi my4=new MaYi("蚂蚁四号");
            my4.start();
            
            
            
        }
    }

    输出的结果如下

    由此可以看出,多个线程同时执行时,并没有按照固定的顺序来执行,而是抢占CPU来执行自身,哪个抢到,哪个先执行

    Runnable 接口

    package com.maya.Test;
    
    public class TuZi implements Runnable {
    
        private String name;
        
        public TuZi(String name){
            this.name=name;
        }
        
        @Override
        public void run() {
            while(true){
                
                try {
                    Thread.sleep(2000);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                System.out.println(this.name+"兔子在跑");
            }
    
        }
    
    }
    
    
    **************************************************************************************************
    
    package com.maya.Test;
    
    public class Test {
    
        public static void main(String [] args){
            
            TuZi t=new TuZi("1号");
            Thread d=new Thread(t);
            d.start();
            
            TuZi t2=new TuZi("2号");
            Thread d2=new Thread(t2);
            d2.start();
            
            TuZi t3=new TuZi("3号");
            Thread d3=new Thread(t3);
            d3.start();
            
            
        }
    }

    在控制台中的结果同上;

    多线程同步块:synchronized(参数){}

    假设兔子3只兔子一共跑了100米,想要三个线程同步,即一只兔子跑了x米,其他兔子继续跑剩下的米数;

    package com.maya.Test;
    
    public class TuZiPao extends Thread {
        
        private static int changdu=100;
        private String name;
        private Object obj;
        
        public TuZiPao(String name, Object obj){
            
            this.name=name;
            this.obj =obj;
            
        }
        
        
        public void run(){
                while(true){
                    
                    synchronized (obj) {    //这里的obj相当于是一把钥匙
    
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                    }
                    changdu--;
                    if(changdu<=0){
                        System.out.println("已经跑完了全程");
                        break;
                    }
                System.out.println(name+"兔子跑了一米,还剩下"+changdu );
                
                
                
                
                    }
                
                
                }
    
        }
        
    }
    **************************************************************************************************
    package com.maya.Test;
    
    public class Test {
    
        private  Object obj;
        public static void main(String [] args){
            
            Object obj=new Object();
            TuZiPao t=new TuZiPao("1号", obj);
            Thread d=new Thread(t);
            d.start();
            
            TuZiPao t2=new TuZiPao("2号",obj);
            Thread d2=new Thread(t2);
            d2.start();
            
            TuZiPao t3=new TuZiPao("3号",obj);
            Thread d3=new Thread(t3);
            d3.start();
            
            
        }
    }

     

     线程的7种状态:  新生,就绪,执行,等待,休眠,死亡,阻塞

    新生:new出来的时候

    Therad s=new Therad();

    就绪:start()

    a.start()

    执行:run()函数中的内容

    public void run() {
            while(true){
                
                try {
                    Thread.sleep(2000);
                }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                System.out.println(this.name+"兔子在跑");
            }
    
        }

    等待:notify()或者notifyall()

    a.notify()

    休眠 : therad.sclle(2000)

    死亡 :线程结束

    阻塞

  • 相关阅读:
    js/es6判断对象是否为空,并判断对象是否包含某个属性
    Hive中的SQL执行计划--几乎所有的SQL都有
    spark中的scalaAPI之RDDAPI常用操作
    spark-scala开发的第一个程序WordCount
    linux中添加自定义命令
    kafka学习总结
    flume的sink写入hive表
    Flume架构以及应用介绍(转)
    Appache Flume 中文介绍(转)
    hiveSQL常用日期函数
  • 原文地址:https://www.cnblogs.com/zhaotiancheng/p/6279817.html
Copyright © 2020-2023  润新知