Java学习:线程

关于线程优先级

public final void setPriority(int newPriority) 可更改线程的优先级。

1 最低优先级   5 默认优先级  10 最大优先级   

易混淆: 并不能保证优先级高的线程先运行完

守护线程

用户线程存在  守护线程可以执行  用户线程执行完  守护线程即使没执行完 jvm也直接退出

public final void setDaemon(boolean on)   on的值为true将线程设置为守护线程,注意一定要在开启线程之前设置.  示例:

  t1.setDaemon(true);
        t1.start();
        t2.start();

join方法

当前线程等待,调用方法的线程进行插队先执行,执行完毕后,在让当前线程执行.对其他线程没有任何影响.注意 此处的当前线程不是调用方法的线程 而是Thread.currentThread()

不同地方插队可能造成的结果:

t1.start();
        // 主线程等待 t1插队 t1执行完毕  main 和 t2抢
        //t1.join();
        t2.start();

        /*
             t1和 t2 抢
                 1. t2先执行完  t1执行完 主线程执行
                 2. t1先执行完  t2还没执行完   t2和主线程抢
         */
        t1.join();

join练习题

如三条线程 t1 t2 t3   同时开启,  保证 t1 t2 t3 顺序执行. 用join方法

package com.doit.demo3;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 =new Thread(new Runnable() {
            @Override
            public void run() {

                for (int i = 0; i < 10; i++) {
                    System.out.println("t1..."+i);
                }
            }
        });

        Thread t2 =new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    t1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int i = 0; i < 10; i++) {
                    System.out.println("t2..."+i);
                }
            }
        });
        Thread t3 =new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    t2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int i = 0; i < 10; i++) {
                    System.out.println("t3..."+i);
                }
            }
        });
        t1.start();
        t2.start();
        t3.start();
    }
}

线程安全问题

 当多条线程访问同一个资源 可能出现数据错误 线程不安全

 同步代码块
                synchronized(任意对象 ){
                    可能出现问题的代码
                }

示例:   如不用synchronized, 打印结果会出现多个线程获取的i值相同.

synchronized (this){
                if(i > 0){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"卖票了..."+i--);

                }
            }

注意:在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他的线程只能在外等着。

 wait和notify

方法

  • void  wait()    在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
  • void  wait(long time)  在time时间内 有人唤醒就唤醒了 否则时间到了 就自己醒来
  • void notify()  唤醒在此对象监视器上等待的单个线程。
  • void notifyAll()  唤醒在此对象监视器上等待的所有线程。

wait和notify必须由锁对象调用 必须在同步中使用
线程遇到wait方法 会进入到等待状态 同时 释放锁对象

当其他线程调用notify方法时 ,会唤醒在此对象监视器上等待的单个线程,注意 此时线程虽然被唤醒 但是不能立即执行,需要先获取到锁 然后才能执行

  wait和sleep区别

 sleep是Thread类的静态方法  休眠到时间后自动醒来执行  在同步外可以使用 在同步内也可以使用
  需要注意 如果sleep方法 在同步中使用 不会释放锁
 wait是Object类的方法 必须由锁对象调用 也就是必须在同步内使用 线程遇到wait方法会释放锁对象,  可以是其他线程 使用notfiy唤醒 也可以使用重载方法 时间到自己醒

线程状态

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值