Java基础笔记08

本文介绍了Java中的多线程概念,包括线程的生命周期、如何创建线程(通过继承Thread类和实现Runnable接口)以及线程的控制方法如sleep和yield。通过案例分析展示了线程在实际应用中的运用。
摘要由CSDN通过智能技术生成

多线程

  • 多线程可以让程序具备多个并发的执行操作;
  • 线程是存在生命周期的。

                新建start()    准备  运行  堵塞  死亡

  • Java中对于线程后,可以保证的只是让每个线程都启动,并且会执行结果,但是无法决定多个线程中哪个先执行,哪个后执行。

————————————————————

创建线程对象

  • 继承Thread类:

        继承Thread类的子类具备了多线程的能力,重写Thread类的run方法,当线程被启动的时候,run方法中的程序就成为了一条独立的执行线程。

例:

public class NumberThread extends Thread {
 
    public CalThread(String name){
        setName(name); //给当前线程取名
    }
    /**
     * 线程start()方法操作的方法
     */
    @Override
    public void run() {
        for(int i=0; i<100; i++){
            String name = getName(); //获取当前线程的名称
            System.out.println(name + "==" + i);
        }
    }
}
 
@Test
public void test1(){
    NumberThread cal = new NumberThread("老司机线程");
    cal.start(); //启动线程
}
  • 实现Runnable接口

        实现Runnable接口,需要实现Runnable接口中提供的run方法,当线程被启动的时候,run方法中的程序就成为了一条独立的执行线程。

例:

public class NumberThread implements Runnable {
    private String name;
    public NumberThread(String name){
        this.name = name;
    }   
 
    /**
     * 线程start()方法操作的方法
     */
    @Override
    public void run() {
        for(int i=0; i<100; i++){
             System.out.println(name + "==" + i);
        }
    }
}
 
@Test
public void test2(){
    NumberThread number = new NumberThread("老司机线程");
    Thread t = new Thread(number);
    t.start(); //启动线程
}

————————————————————

控制(调度)线程

  • 睡眠的方法

        当线程处于运行状态时,调用sleep方法将使线程从运行状态进入阻塞状态,从而使程序中断运行。使正在运行的线程让出CPU最简单的方法之一。

例:

public class NumberThread implements Runnable {
    private String name;
 
    public NumberThread(String name){
        this.name = name;
    }
    /**
     * 线程start()方法操作的方法
     */
    @Override
    public void run() {
        for(int i=0; i<5; i++){
            System.out.println(name + "==" + i);
            try {
                 Thread.sleep(1*1000); //让线程睡眠1秒钟
            } catch (InterruptedException e) {
                 e.printStackTrace();
            }
        }
    }
}
@Test
public void test2(){
    NumberThread number = new NumberThread("老司机线程");
    Thread t = new Thread(number);
    t.start(); //启动线程
}
  • 让步的方法

        当线程处于运行状态时,调用sleep方法将使线程从运行状态进入阻塞状态,从而使程序中断运行。将CPU让给哪一个线程是不确定的。

例:

public class YieldThread extends Thread { 
    public YieldThread(String name) { 
        super(name); 
    } 
 
    @Override 
    public void run() { 
        for (int i = 1; i <= 50; i++) { 
            System.out.println("" + this.getName() + "-----" + i); 
            // 当i为30时,该线程就会把CPU时间让掉,让其他或者自己的线程执行(也就是谁先抢到谁执行) 
            if (i == 30) { 
                yield(); 
            } 
        } 
    }  
} 
 
public static void main(String[] args) {
    YieldThread yt1 = new YieldThread("张三");
    YieldThread yt2 = new YieldThread("李四");
    yt1.start();
    yt2.start();
}

————————————————————

案例:

        需求分析:费玉清去健身房。

/**
 * 费玉清
 *
 * @author qin
 */
public class FeiYuqing extends Thread {
    @Override
    public void run() {
        int race = 100;
        while(race > 0){
            try {
                int x = (int) (Math.random()*20);
                if(race - x >= 0){
                    race = race - x;
                    sleep(1*1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("¥费玉清还有"+race+"米就逃跑成功啦");
        }
        System.out.println("**********费玉清逃跑成功");
    }
}
/**
 * 大猩猩
 *
 * @author qin
 */
public class Chimpanzee extends Thread {
 
    @Override
    public void run() {
        int race = 100;
        while(race > 0){
            try {
                int x = (int) (Math.random()*20);
                if(race - x >= 0){
                    race = race - x;
                    sleep(1*1000);
               }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("!大猩猩还有"+race+"米就抓到费玉清啦");
        }
        System.out.println("**********大猩猩抓到了费玉清,祝你们幸福");
    }
}
/**
 * 健身房
 *
 * @author qin
 */
public class Gym {
 
    public static void main(String[] args) {
        FeiYuqing fei = new FeiYuqing();
        fei.start(); //费玉清跑
        Chimpanzee chi = new Chimpanzee();
        chi.start(); //大猩猩追
    }
}

——————————————————————————————————————

笔记内容来源:大坏蛋^_^的博客_CSDN博客-Java基础,Linux,SpringBoot+领域博主

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值