38、java的多线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18077275/article/details/89813500

1、操作系统与进程

程序是一段静态的代码,它是应用软件执行的蓝本。
进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。
现代操作系统可以同时管理一个计算机系统中的多个进程,即可以让计算机系统中的多个进程轮流使用CPU资源。
 
2、进程与线程

线程是比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有它自身的产生、存在和消亡的过程。 
线程间可以共享进程中的某些内存单元(包括代码与数据),线程的中断与恢复可以更加节省系统的开销。
 
3、java的多线程机制

Java语言的一大特性点就是内置对多线程的支持。
Java虚拟机快速地把控制从一个线程切换到另一个线程。这些线程将被轮流执行,使得每个线程都有机会使用CPU资源。
每个Java应用程序都有一个缺省的主线程。
JVM一直要等到Java应用程序中的所有线程都结束之后,才结束Java应用程序 。 
 
4、线程的状态与生命周期

线程在它的一个完整的生命周期中通常要经历如下的四种状态:
1).新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。
2).运行 :线程必须调用start( )方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。一旦轮到它来享用CPU资源时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了。   
3).中断:有4种原因的中断:
◆ JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。
◆线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状。
◆线程使用CPU资源期间,执行了wait( )方法。
◆线程使用CPU资源期间,执行某个操作进入阻塞状态。
4).死亡 :处于死亡状态的线程不具有继续运行的能力。线程释放了实体。 
 5、线程调度与优先级

处于就绪状态的线程首先进入就绪队列排队等候CPU资源,同一时刻在就绪队列中的线程可能有多个。Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别,分别用Thread类中的类常量表示。 
Java调度器的任务是使高优先级的线程能始终运行,一旦时间片有空闲,则使具有同等优先级的线程以轮流的方式顺序使用时间片。 
 
6、Thread的子类创建线程

在Java语言中,用Thread类或子类创建线程对象。
在编写Thread类的子类时,需要重写父类的run()方法,其目的是规定线程的具体操作,否则线程就什么也不做,因为父类的run()方法中没有任何操作语句。
 
7、示例代码

Ant.java
public class Ant extends Thread {

    Cake cake;

    public Ant(String name, Cake cake) {
        this.cake = cake;
        setName(name);
    }

    @Override
    public void run() {
        while(true){
            int n = 2;
            System.out.println(getName()+"吃"+n+"克蛋糕");
            cake.lost(n);
            System.out.println(getName()+"发现蛋糕还剩下"+cake.getSize()+"克");
            
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            
            if(cake.getSize()<=0){
                System.out.println(getName()+"已经进入死亡状态了");
                return;
            }
        }
    }
}

Cake .java
public class Cake {
    int size;

    public void setSize(int n) {
        size = n;
    }

    public int getSize() {
        return size;
    }

    public void lost(int m) {
        if (size - m >= 0) {
            size = size - m;
        }
    }
}

Demo43 .java
public class Demo43 {

    public static void main(String[] args) {
        Cake cake = new Cake();
        int size = 10;
        cake.setSize(size);
        System.out.println("蛋糕大小是"+size+"克");
        
        Ant antRed = new Ant("红蚂蚁", cake);
        Ant antBlack = new Ant("黑蚂蚁", cake);
        antRed.start();
        antBlack.start();
    }

}
 

猜你喜欢

转载自blog.csdn.net/qq_18077275/article/details/89813500