Java程序员大数据 爬虫Python AI Sql

多线程基础篇--线程状态

2017-01-26  本文已影响38人  小鱼嘻嘻

1.多线程之线程状态

先看一下我网上找到的图:


Paste_Image.png
  1. 当前线程高风亮节让出CPU,也就是调用yeild()方法,是当前线程回到runnable状态。
    2)当前线程调用了sleep(),线程进入了wait状态,也就是图上所说的blocked();如果线程调用join()也是类似情况
    3)当前线程遇到同步代码块,或者同步方法(synchronized)线程会进入blocked状态;如果线程被wait()也也进入blocked状态。

2.多线程之创建线程

多线程有两种创建方式:

//通过实现的方式
    static class MyThread1 implements Runnable {
        public void run() {
            System.out.println("this is implements two method....");
        }
    }
  //通过继承的方式
    static class MyThread extends Thread {
        public void run() {
            System.out.println("this is extends thread one method.....");
        }
    }

Thread 和Runnable区别:

package com.yuxi;

/**
 * Created by yuxi on 17/1/26.
 */
public class MyThread {
    public static void main(String[] args) {
        MyThreadOne myThreadOne1 = new MyThreadOne();
        myThreadOne1.start();

        MyThreadOne myThreadOne2 = new MyThreadOne();
        myThreadOne2.start();

        MyThreadOne myThreadOne3 = new MyThreadOne();
        myThreadOne3.start();
        MyThreadTwo myThreadTwo = new MyThreadTwo();
        Thread thread1 = new Thread(myThreadTwo);
        Thread thread2 = new Thread(myThreadTwo);
        Thread thread3 = new Thread(myThreadTwo);
        thread2.start();
        thread1.start();
        thread3.start();
    }

    static class MyThreadOne extends Thread {
        private int ticket=10;
        public void run() {
            for (int i = 0; i < 20; i++) {
                if (ticket>0) {
                    System.out.println("当前" + Thread.currentThread().getName() + "买了" + (ticket--) + "票");
                }
            }
        }
    }


    static class MyThreadTwo implements Runnable {
        private int ticket=10;
        public void run() {
            for (int i = 0; i < 20; i++) {
                if (ticket>0) {
                    System.out.println("当前" + Thread.currentThread().getName() + "买了" + (ticket--) + "票");
                }
            }
        }
    }


}

如果是extends结果是:

当前Thread-0买了10票
当前Thread-0买了9票
当前Thread-0买了8票
当前Thread-0买了7票
当前Thread-0买了6票
当前Thread-0买了5票
当前Thread-0买了4票
当前Thread-0买了3票
当前Thread-0买了2票
当前Thread-0买了1票
当前Thread-1买了10票
当前Thread-1买了9票
当前Thread-1买了8票
当前Thread-1买了7票
当前Thread-1买了6票
当前Thread-1买了5票
当前Thread-1买了4票
当前Thread-1买了3票
当前Thread-1买了2票
当前Thread-1买了1票
当前Thread-2买了10票
当前Thread-2买了9票
当前Thread-2买了8票
当前Thread-2买了7票
当前Thread-2买了6票
当前Thread-2买了5票
当前Thread-2买了4票
当前Thread-2买了3票
当前Thread-2买了2票
当前Thread-2买了1票

如果是implement结果是:

当前Thread-1买了10票
当前Thread-0买了9票
当前Thread-1买了8票
当前Thread-0买了7票
当前Thread-0买了5票
当前Thread-1买了6票
当前Thread-1买了3票
当前Thread-1买了2票
当前Thread-0买了4票
当前Thread-2买了1票

原因是因为:
MyThreadTwo myThreadTwo = new MyThreadTwo();
这个对于启动的三个线程是共享的,他的成员变量 private int ticket=10;是公共资源存在竞争。
MyThreadOne myThreadOne1 = new MyThreadOne();
MyThreadOne myThreadOne2 = new MyThreadOne();
MyThreadOne myThreadOne3 = new MyThreadOne();
分别启动了三个,这三个之间是不存在竞争的。

参考文章:
http://www.cnblogs.com/skywang12345/p/3479063.html

上一篇下一篇

猜你喜欢

热点阅读