Java基础之多线程

来源:互联网 发布:php二分查找算法 编辑:程序博客网 时间:2024/05/22 12:28

前提:刚刚开始认真的学习Java基础,巩固加复习,由于是新手,所以有错的地方请多多提出,这些只是我自己的理解,如果不够全面,或者有错误也希望多理解,多指出。

1.说一下Thread类中常用的与多线程生命周期相关方法:

yield():
让其他线程允许占用自己的资源,但并不一定有其他线程占用自己的资源。

//举例说明,以下线程都不是线程安全的,仅供参考public class TestThread {    public static void main(String[] args) {        Window w1 = new Window();        Window w2 = new Window();        w1.setName("窗口1");        w2.setName("窗口2");        w1.start();        w2.start();    }}class Window extends Thread{    static int tickets = 5;    public void saleTicket(){        while(true){            if(tickets > 0){                System.out.println(Thread.currentThread().getName()+                        ": 售出第"+tickets--+"张票");                Thread.yield();//让线程yield            }else{                break;            }        }    }    public void run(){        saleTicket();    }}

join():

可以使得一个线程在另一个线程结束后再执行。如果join()方法在一个线程实例上调用,当前运行着的线程将阻塞直到这个线程实例完成了执行。

//代码示例,以下线程都不是线程安全的,仅供参考public class TestThread {    public static void main(String[] args) {        Window w1 = new Window();        Window w2 = new Window();        w1.setName("窗口1");        w2.setName("窗口2");        w1.start();        try {            w1.join();//让w1抢占资源        } catch (InterruptedException e) {            e.printStackTrace();        }        w2.start();    }}class Window extends Thread{    static int tickets = 5;    public void saleTicket(){        while(true){            if(tickets > 0){                System.out.println(Thread.currentThread().getName()+                        ": 售出第"+tickets--+"张票");            }else{                break;            }        }    }    public void run(){        saleTicket();    }}

sleep():
表面意思就是休眠;表示让一个线程进入休眠状态,休眠一定的时间以后进入运行。

//代码示例,以下线程都不是线程安全的,仅供参考public class TestThread {    public static void main(String[] args) {        Window w1 = new Window();        Window w2 = new Window();        w1.setName("窗口1");        w2.setName("窗口2");        w1.start();        w2.start();    }}class Window extends Thread{    static int tickets = 5;    public void saleTicket(){        while(true){            try {                Thread.sleep(10);//让线程进入休眠            } catch (InterruptedException e) {                e.printStackTrace();            }            if(tickets > 0){                System.out.println(Thread.currentThread().getName()+                        ": 售出第"+tickets--+"张票");            }else{                break;            }        }    }    public void run(){        saleTicket();    }}

wait():
让一个线程进入等待,需要有notify()方法唤醒线程。

notify():
唤醒一个等待的线程。

notifyAll():
唤醒所有等待的线程。wait(),notify(),notifyAll().这三个方法必须在同步代码块中使用。

//示例代码(wait,notify,notifyAll),此线程是线程安全的,仅供参考public class TestRunnable {    public static void main(String[] args) {        Window1 w1 = new Window1();        Thread t1 = new Thread(w1);        Thread t2 = new Thread(w1);        t1.setName("窗口1");        t2.setName("窗口2");        t1.start();        t2.start();    }}class Window1 implements Runnable{    static Integer tickets = 5;    public void saleTicket(){        while(true){            synchronized (this) {                notifyAll();//下一个线程过来叫醒等待的线程                //notify();或者用这个方法                if(tickets > 0){                    System.out.println(Thread.currentThread().getName()+                            ": 售出第"+tickets--+"张票");                }else{                    break;                }                try {                    wait();//让其等待                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }    public void run(){        saleTicket();    }}

2.wait方法和sleep方法的区别

  • wait方法是Object类里面的方法,sleep是Thread类里面的方法
  • wait,notify,notifyAll方法在多线程的使用中需要在 synchronized 代码块中,或者synchronized 修饰的方法中使用。注意:如果当前线程不是对象所得持有者,该方法抛出一个java.lang.IllegalMonitorStateException 异常”。sleep方法可以在任何地方使用。
  • 在同步锁中使用sleep并不会释放锁,但是wait在同步锁中被调用时,将会失去同步锁,进入等待状态。

3.这几个方法的与运行周期之间的关系,如下图:

0 0
原创粉丝点击