Java多线程(一)

什么是多线程

Java语言的一大特性就是内置了对多线程的支持,多线程是指同时存在几个执行体,按几条不同的线索共同工作的情况。
多线性(Multithread)是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的储存空间,而是和所属进程中的其他线程共享一个储存空间,这使得线程间的通信比进程间的通信更为简单。
这里写图片描述这里写图片描述

线程的调度与优先级

Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别。每个Java线程的优先级都在1(Thread.MIN_PRIORITY)和10(Thread.MAX_PRIORITY)之间。如果没有明确地设置线程的优先级别,每个线程的优先级通常为5(Thread.NORM_PRIORITY)。

线程的优先级可以通过setPriority(int grade)方法调整。如果参数不在1~10的范围内,那么setPriority便产生一个IllegalArgumenException异常。需要注意的是有些操作系统只能识别三个级别:1,5,10;

thread.setPriority(10);

创建线程

用Thread子类创建线程

用Thread子类创建两个线程,这两个线程共享一个StringBuffer对象,两个线程在运行期间将修改StringBuffe对象中的字符。
为了使结果尽量不依赖与当前的CPU使用情况,应当让线程主动调用sleep()方法,让出CPU的使用权进入中断状态。

package com.thread;

public class MultiThread_Thread {
    public static void main(String[] args) {
        StringBuffer str = new StringBuffer();
        People p1= new People("张三", str);
        People p2= new People("李四", str);
        p1.start();
        p2.start();

    }
}

class People extends Thread {
    StringBuffer str;

    People(String s, StringBuffer str) {
        setName(s);
        this.str = str;
    }

    public void run() {
        for (int i = 1; i <= 3; i++) {
            str.append(getName() + ",");
            System.out.println("wj" + getName() + ",mzs:" + str);
            try {
                sleep(200);
            } catch (InterruptedException e) {

            }
        }
    }
}

用实现Runnable接口方式创建线程

采用Runnable接口方式创建两个线程thread1和thread2,这两个线程使用同一个目标对象,共享目标对象的成员变量number。thread1递增number,thread2递减number,当number小于80时thread1结束run()方法,进入死亡状态;当number小于0时,thread2结束run()方法,进入死亡状态。

package com.thread;

public class MultiThread_Runnable {

    public static void main(String[] args) {
        Bank bank = new Bank();
        bank.setMoney(200);

        Thread thread1 = new Thread(bank);
        Thread thread2 = new Thread(bank);
        thread1.setName("one");
        thread2.setName("two");
        thread1.start();
        thread2.start();

    }

}

class Bank implements Runnable{

    private int number = 0;

    public void setMoney(int m){
        number = m;
    }

    public void run() {
        while(true){
            String name = Thread.currentThread().getName();

            if(name.equals("one")){
                if(number<=80){
                    System.out.println(name+"进入死亡状态");
                    return;
                }
                number+=10;
                System.out.println("Thread "+name+"当前number"+number);
            }

            if(name.equals("two")){
                if(number<=0){
                    System.out.println(name+"进入死亡状态");
                    return;
                }
                number-=100;
                System.out.println("Thread "+name+"当前number"+number);
            }

            try{
                Thread.sleep(800);
            }catch(InterruptedException e){}
        }
    }


}
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页