多线程篇

先举个例证

电脑的骨干是CPU,它肩负了统计机所有统计任务,可以把它知道为像一个厂子,时刻在运作。

若果工厂有一个电力系统,工厂有不少车间,三回只可以供给一个车间使用,也就是说一个车间开工的时候,其他车间必须停工。背后的含义就是单个CPU五遍只可以运行一个任务,所以现在的处理器都是多核的。

进程就好比厂子的车间,它表示CPU所能处理的单个任务。任何一个整日,CPU总是运行一个进程,其他进程处于非运行情况(这是对准单核来说的)


一个车间里,可以有很对工人,他们同台完成一个任务,线程就好比车间里的工人,一个(车间)进程可以蕴涵三个(工人)线程。

故此得出:

进程:系统开展程序的着力单位,有单独的内存空间和系统资源(简单的可以了解为一个软件的运转,如一个qq的运转就是一个过程)

线程:经过中实施运算的微乎其单电位,处理机分配给线程,即确实在拍卖机上运行的是线程。

线程的兑现

二种艺术:

–>继承Thread类
(extends),重写run()方法,调用start()启动线程

–>实现runnable接口(implements),重写run()方法,调用start()启动线程

亚洲城误乐城ca88网站, 

线程的命名

相似在线程启动前去命名,不指出启动后在改动,也不提议对不同的线程取相同的名字

二种命名形式:系统默认命名和自定义名称

class MyThread extends Thread{


    public void run(){
        for (int i = 0; i <=5; i++) {
            //获得当前线程的名字
        //得到的结果为如:Thread-0、Thread-1 默认的线程名称从0开始

            System.out.println(Thread.currentThread().getName()+"-"+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class Test07 {
    public static void main(String args[]) {
        MyThread  t=new MyThread();
        //自定义名称的操作:传参 命名
        new Thread(t,"我").start();
        new Thread(t,"你").start();
        //未命名,从0开始编号
        new Thread(t).start();        
    }
}

线程的休眠

  就是让线程执行慢下来

  Thread.sleep(时间);

线程的优先级

class MyDThread extends Thread{
    public void run(){
        for (int i = 0; i <=5; i++) {
            //获得当前线程的名字
            System.out.println(Thread.currentThread().getName()+"-"+i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
public class Test08 {
    public static void main(String args[]) {
        MyDThread  t=new MyDThread();
        Thread t1=new Thread(t,"我");
        Thread t2=new Thread(t,"你");
        Thread t3=new Thread(t,"他");
        /*
         * 设置线程的优先级,1最低 10最高
         * 优先级不是那么绝对的优先,只是有几率的优先 
         * 其实就是人民币玩家和普通玩家的区别
         * 人民币玩家 <高优先 但不是无敌的> 普通玩家<也是有几率胜的>
         */
        t2.setPriority(Thread.MAX_PRIORITY);
        t1.start();
        t2.start();
        t3.start();        
    }
}

 本章常见问题

1.一个JVM进程启动时至少启动多少个线程?

  2个:main主线程   gc线程:垃圾回收

2.主线程main方法的先期级别是数字多少?

  中等级别5

线程的一起

同步:就是一个线程对象,要等待另一个线程对象执行到位之后的操作规则
多少个点子:
    同步代码块
    同步方法
 一头异步的得失

  异步功能高
  同步线程安全

public class Test09 {
    public static void main(String[] args) {
        MyThread1  myThread=new MyThread1();
        new Thread(myThread,"售货员A").start();
        new Thread(myThread,"售货员B").start();
        new Thread(myThread,"售货员C").start();
        new Thread(myThread,"售货员D").start();
    }
}

class MyThread1 implements Runnable{
    int count=5;
    @Override
    //synchronized public void run() {   同步方法,在方法前面加上synchronized
    public void run() {
        for (int i = 1; i <10; i++) {
            synchronized (this) {
if(count>0){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }
            System.out.println(Thread.currentThread().getName()+"卖了第"+(count--)+"个包子");
        }
            }    }    
    }

}

死锁:当线程同步过多时,就会暴发死锁

就好比我在天安门等您,你在王府井等我,大家都在等待,但千古等不到对方,最终就只可以等死了…..