Thread与Runnable的区别

来源:互联网 发布:ubuntu 迅雷 编辑:程序博客网 时间:2024/05/17 23:56
public class MyThread extends Thread {    int ticket = 2;    @Override    public void run() {        synchronized (MyThread.class){            for(int i = 0; i < 10 ; i ++){                if(ticket > 0){                    System.out.println("threadId:" + Thread.currentThread().getId() + "\t\t余票:" + ticket);                    ticket -- ;                }else {                    System.out.println("threadId:" + Thread.currentThread().getId() + "\t\t没票了。");                    break;                }            }        };    }}public class MyRunnable implements Runnable {    int ticket = 2;    @Override    public void run() {        synchronized (MyRunnable.class){            for (int i = 0; i < 10; i++) {                if (ticket > 0) {                    System.out.println("threadId:" + Thread.currentThread().getId() + "\t\t余票:" + ticket);                    ticket--;                } else {                    System.out.println("threadId:" + Thread.currentThread().getId() + "\t\t没票了。");                    break;                }            }        };    }}public Thread()public Thread(Runnable target)Thread thread = new MyThread();thread.run();thread.run();thread.start();new MyThread().start();new MyThread().start();Runnable myRunnable = new MyRunnable();myRunnable.run();new Thread(myRunnable).start();new Thread(myRunnable).start();------------thread.run()------------run只是当作普通方法调用(可以多次调用,并不会创建新线程(与调用者所处的线程有关可以是子线程也可以是主线程)),测试时是在主线程调用的,所以线程id为1。)threadId:1余票:2threadId:1余票:1threadId:1没票了。------------thread.run()------------threadId:1没票了。------------thread.start()------------会新建线程,且start只能被调用一次(多次调用会抛异常)threadId:12没票了。------------new MyThread().start()------------每个Thread实例都拥有自己的ticket属性threadId:13余票:2threadId:13余票:1threadId:13没票了。------------new MyThread().start()------------每个Thread实例都拥有自己的ticket属性threadId:14余票:2threadId:14余票:1threadId:14没票了。------------myRunnable.run()------------run只是当作普通方法调用(可以多次调用,并不会创建新线程),threadId:1余票:2实现Runnable接口的并不是线程类(没有start方法可调用),只有Thread及其子类才是线程类。threadId:1余票:1threadId:1没票了。------------new Thread(myRunnable).start()------------多个Thread实例共用一个"target",即共用ticket属性threadId:15没票了。------------new Thread(myRunnable).start()------------多个Thread实例共用一个"target",即共用ticket属性threadId:16没票了。Thread调用run方法并不会新建线程Thread只有在调用start方法时才会新建线程,并自动调用run方法。


原创粉丝点击