关于多线程:多线程学习第二课

45次阅读

共计 1519 个字符,预计需要花费 4 分钟才能阅读完成。

1、思考题

a、sleep 和 wait 的差异
    答:1)最次要是 sleep 办法没有开释锁,而 wait 办法开释了锁,使得其余线程能够应用同步控制块或者办法(锁代码块和办法锁)。2)wait 是 Object 办法,sleep 是 Thread 特有的办法
b、为什么说线程启动后不肯定会立即执行
    答:须要期待 CPU 的调度,如果 CPU 没有闲暇内核,那线程将期待执行。c、应用 wait 和 notify 的时候 须要有做些什么
    答:必须在同步办法中应用 wait 和 notify, 因为执行 wait 和 notify 的前提条件是必须持有同步办法的 monitor 的所有权,运行上面任何一个办法都会抛出非法 monitor 状态异样 IllegalMonitorStateException

2、线程有哪些办法

    1)currentThread 获取以后线程
    2)isAlive 是否存活
    3)sleep 暂停以后线程执行
    4)getId 获取以后线程的惟一标识
    5)interrupt 终止以后线程执行
    6)this.interrupted 判断以后线程是否中断,具备分明中断状态的作用
    7)this.isInterrupted 判断 Thread 线程是否中断 
    8)suspend/resume 暂停和复原线程
    8)yield 放弃以后 cpu 资源,将它让给其余工作
    9)setPriority 设置线程执行的优先级 1-10
    10)join 办法只会使主线程 (或者说调用 t.join() 的线程)进入期待池并期待 t 线程执行结束后才会被唤醒。并不影响同一时刻处在运行状态的其余线程。

3、线程的状态转换

4、课后作业

1、给一个文件文件外面有 10 万条记录每一行是一个 0 -100000 之间的随机数  咱们通过启动一个线程 来统计下这个文件外面大于 80000 数字有多少个。并统计下耗时    
public static void main(String[] args) {List<Integer> data = getData();
        Thread t1 = new Thread(new Runnable(){
            @Override
            public void run() {System.out.println("开始统计......");
                long start= System.currentTimeMillis();
                Integer count = 0;
                for (Integer item : data) {if (item >= 80000) {count ++;}
                }
                long end =System.currentTimeMillis();
                System.out.println("统计完结,耗时:" + (end-start) + "毫秒");
                System.out.println("统计后果 count=" +count);
            }
        });
        t1.start();}
    
    /**
     * 获取 10 万个 0 -100000 之间的随机数
     * @author yy.xiong
     **/
    private static List<Integer> getData(){
        Integer min = 0;
        Integer max = 100000;
        List<Integer> data = Lists.newArrayList();
        for (int i=1; i<=100000; i++){int item =  (int)(min+Math.random()*max);
            data.add(item);
        }
        return data;
    }

    // 执行后果:开始统计......
    统计完结,耗时:5 毫秒
    统计后果 count=20056

    Process finished with exit code 0

2、用 wait 和 notify 的例子 启动两个线程:1 号线程 打印【步骤 1】而后进入期待 期待完结打印【步骤 4】2 号线程打印【步骤 2】而后 sleep 3 秒 而后打印【步骤 3】而后唤醒 1 号线程

正文完
 0