Java_总结十二(多线程)

一、进程

  操作系统中的一个软件,是操作系统分配内存的最基本的单位

 

二、线程

  --进程中的一条执行路径

  --线程的生命周期包括五个状态:新生状态、可运行状态、运行状态、阻塞状态和死亡状态

 

三、多线程

  进程中同时执行着多个路径

 

  多线程的好处:

    ①提高执行效率

    ②可以提高资源的利用率

 

    多线程执行特性:

    --随机性(异步执行) 谁抢到cpu

    --宏观意义上讲: 多线程就是在同一时刻执行多个线程

    --微观意义上讲: cpu同一时间只能执行一个线程,多核除外

  

四、多线实现分类

  没有共享资源, 相同操作

    --类继承Thread

 

  共享资源,相同操作

    --资源类实现Runnable接口

    --只会创建一个资源类对象

    --多个线程共享一份资源

 

  共享资源  不同操作

    --创建资源类

    --创建不同操作类   实现 Runnable 接口

    --创建操作类  并且把资源类对象传递进去

    --创建线程并且启动

/*
 * 需求:你有一张银行卡,卡有余额0,你往银行卡存钱,你女朋友取钱,请编写程序模拟过程
    分析
    1存在资源共享
    2一个人存钱,一个人取钱(操作不同)

 */
public class Test01 {
    public static void main(String[] args) {
        BankCard card = new BankCard();
        GetMoney gm = new GetMoney(card);
        SetMoney sm = new SetMoney(card);
        Thread t1 = new Thread(sm);
        Thread t2 = new Thread(gm);
        t1.start();
        t2.start();
    }
}

//银行卡
class BankCard {
    private double money=0;
    public double getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
}

/**
 * 存钱
 */
class SetMoney implements Runnable{
    BankCard card;
    public SetMoney(BankCard card) {
        this.card = card;
    }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            card.setMoney(card.getMoney()+1000);
            System.out.println(Thread.currentThread().getName()+"存 1000,剩余    "+card.getMoney());    
        }
    }
}
/**
 * 取钱
 */
class GetMoney implements Runnable{
    BankCard card;
    public GetMoney(BankCard card) {
        this.card = card;
    }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
             card.setMoney(card.getMoney()-1000);
             System.out.println(Thread.currentThread().getName()+"取1000,剩余    "+card.getMoney());
        }
    }
}

  执行结果:

Thread-1取1000,剩余    0.0
Thread-1取1000,剩余    -1000.0
Thread-1取1000,剩余    -2000.0
Thread-1取1000,剩余    -3000.0
Thread-1取1000,剩余    -4000.0
Thread-1取1000,剩余    -5000.0
Thread-1取1000,剩余    -6000.0
Thread-1取1000,剩余    -7000.0
Thread-1取1000,剩余    -8000.0
Thread-1取1000,剩余    -9000.0
Thread-0存 1000,剩余    1000.0
Thread-0存 1000,剩余    -8000.0
Thread-0存 1000,剩余    -7000.0
Thread-0存 1000,剩余    -6000.0
Thread-0存 1000,剩余    -5000.0
Thread-0存 1000,剩余    -4000.0
Thread-0存 1000,剩余    -3000.0
Thread-0存 1000,剩余    -2000.0
Thread-0存 1000,剩余    -1000.0
Thread-0存 1000,剩余    0.0

 

五、Thread类中的方法

  startrun的区别

    --start() 会创建新的栈空间会产生新的子线程(工作线程)

     --run()调用线程对象中的run方法,不会产生新的线程,是在主线程中执行的

 

  joinsleepyieldsetPriority()

    --Join()  插入/合并,插入到当前线程的前面,在哪个线程调用就阻塞的哪个线程

     --sleep()   当前线程睡眠进入到阻塞状态释放cpu资源,其他的线程均可抢占cpu资源

     --yield()    当前线程进入到可执行状态释放了cpu资源,自己和自己优先级相同或者更高的线程可以抢占cpu资源

     --setPriority()   设置线程优先级优先级高的尽可能多去抢占cpu源  (可能不准),级别1-101位低,10为高

     --Thread.currentThread().setName()设置线程的名字

      在线程类中,可以通过构造方法调用父类ThreadsetName()--------super.setName();

     --Thread.currentThread().getName()  获取线程的名字

 

六、终止线程的方式

  ①通过标志位   能够将run方法执行完毕

    注意:这里没截图完整,标志位的注释也要打开

  

  ②stop()   不推荐使用,run方法可能不能完全执行完毕     

  ③interrupt ()   通过抛出异常的方式来终止的

posted @ 2017-05-13 11:41  Java_皮卡丘漏电  阅读(87)  评论(0编辑  收藏  举报