javase:多线程

线程生命周期

在这里插入图片描述

线程API

ThreadAPIExample.java
线程优先级
1.线程优先级用数字表示:1-10,默认优先级为5
2.API
①int getPiority()//获取优先级
②void setPriority(int) //设置优先级
3.优先级常量
①Thread.MAX_PRIORITY=10
②Thread.MIN_PRIORITY=1
③Thread.NORM_PRIORITY=5
注意:线程优先级只是在JVM有效,线程根本执行在操作系统。所有线程设置的级别,不能决定线程是否根据优先级执行

线程休眠

1.线程休眠:让线程休息,即是让当前线程由运行状态进入到阻塞状态,进而使其他线程有机会继续执行任务。虽然使线程休眠但并不释放对象锁,所以说如果在同步块中使用sleep(),其他线程仍然无法获得执行权
2.API:static void sleep(long millis)线程休眠 long millis休眠时间 单位:毫秒
3.总结
①sleep()是静态方法,可以直接调用
②sleep方法使线程由运行状态转化为休眠阻塞状态
③sleep()并不会释放对象锁

线程让步

1.线程让步:让当前线程休息一会,即让当前线程由运行状态(Running)进入到可运行状态(Runnable),线程让步不释放对象锁。其他线程仍然获取不到锁,需要等待当前线程执行完之后才能获取锁执行任务
2.API:static void yield() 暂停当前正在执行的线程对象,并执行其他线程
3.总结
①yield()方法是静态方法,可直接调用
②yield()方法并没有释放对象
③yield()会使线程由运行时状态转化到可运行状态

package ThreadDemo;

public class ThreadSleepDemo {

    public static void main(String[] args) {

        Thread2 t1 = new Thread2();
        t1.setName("线程A");
        t1.start();

        Thread2 t2 = new Thread2();
        t2.setName("线程B");
        t2.start();

    }
}

class Thread2 extends Thread{

    public Thread2(){
    }

    public Thread2(String name){
        super(name);
    }

    @Override
    public void run(){
        while(true){
            //线程休眠
            String name = Thread.currentThread().getName();
            //if("线程A".equals(name)){
                try {
                    Thread.sleep(1000);//休眠时间 1s
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            //}
            System.out.println(Thread1.currentThread().getName()+"----t1----");
        }
    }
}

线程串行

1.线程串行:当前线程等待子线程执行完毕后,才能继续执行
2.API:①void join() 等待该线程终止
②void join(long millis)等待该线程终止的时间最长为millis毫秒
3.总结:
①join()方法本质上是通过wait()方法实现阻塞的
②如果子线程没有启动或者子线程执行结束,主线程不用等待可以继续执行
线程终止

package ThreadDemo;

public class ThreadJoinDemo {

    public static void main(String[] args) throws InterruptedException {
        JoinThread t1 = new JoinThread();

        t1.start();
        t1.setName("线程A");
        t1.join();//t1是子线程 t1没有执行完,main()不会执行
        System.out.println("main");
    }

}
class JoinThread extends Thread{
    @Override
    public void run(){
        int i = 0;
        while(i < 5){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Hello World");
            i++;
        }
    }
}

线程终止

当前线程完成任务后,返还资源,进入死亡状态

线程终止方式

①void stop();用来终止线程。但是该方法终止线程,并不是释放对象锁,容易造成死锁,已淘汰
②采用标记的方式
(1)提供boolean类型
(2)提供getter和setter方法
(3)在循环中使用该属性作为条件
(4)在创建对象资源时设置属性为true
③采用守护线程方式
守护线程:为了帮助主线程完成功能而提供的一个辅助线程,主线程终止辅助线线程也必须终止
void setDanmon(boolean on) 设置当前是否为守护线程,默认为false

package ThreadDemo;

public class ThreadStopDemo {
    public static void main(String[] args) throws InterruptedException {
        ThreadStop t1 = new ThreadStop();
        t1.setFlag(true);
        t1.start();
        Thread.sleep(2000);
        t1.setFlag(false);
        System.out.println("main");
    }
}

class ThreadStop extends Thread{
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
    private boolean flag;
    @Override
    public void run(){
        while(flag){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Hello World");
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值