Java 线程基础

start()和run()的区别

start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。
run() : run()就和普通的成员方法一样,可以被重复调用。单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程!

通过下面的代码就可以验证上面的结论:

    static class MyThread extends Thread {
        @Override
        public void run() {
            super.run();
            System.out.println("Thread is running on :"+Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {

        MyThread myThread = new MyThread();
        myThread.run();

        myThread.start();
    }

打印结果:

Thread is running on :main
Thread is running on :Thread-0

sleep

sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。
重点是它不会释放线程锁,通过代码验证一下:

    public static Object object = new Object();

    static class MyThread extends Thread{

        @Override
        public void run() {
            super.run();

            synchronized (object) {
                for (int i = 0; i < 5; i++) {
                    System.out.println(Thread.currentThread().getName()+"=="+i);

                    if (i==4) {
                        try {
                            sleep(2*1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        Thread thread = new MyThread();
        Thread thread2 = new MyThread();

        thread.start();
        thread2.start();
    }

打印结果:

Thread-0==0
Thread-0==1
Thread-0==2
Thread-0==3
Thread-0==4
Thread-1==0
Thread-1==1
Thread-1==2
Thread-1==3
Thread-1==4

分析上面的代码,两个线程共同持有object对象锁,当thread线程打印到4时休眠两秒钟,但是这个时候它并没有释放object的对象锁,所以thread2 也并没有得到执行。

wait、notiy、notiyall

释放线程锁,必须使用在synchronized 代码块中

sleep 和wait的比较

1.wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而sleep()的作用是也是让当前线程由“运行状态”进入到“休眠(阻塞)状态”。
但是,wait()会释放对象的同步锁,而sleep()则不会释放锁。

2.wait是Object类的方法而sleep是Thread类的方法。

阅读更多
文章标签: Java线程基础
个人分类: JAVA
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭