线程系列(一)--基础

基础

1.什么是线程
我也解释不清,我们先知道它是一个可以独立运行的单位,然后一个进程可以有多个线程并能多线程同时运行就行了。下面是百度百科解释,有兴趣可以看一下。
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
2.怎样使用线程
一种:继承Thread,重写run()
另一种:实现Runnable接口并把此对象传给Thread的构造函数

Thread

好啦,那我就来看看Runnable和Thread这两个类吧

Runnable其实就是一个接口,里面就一个run方法
public interface Runnable {
    public void run();
}
Thread就复杂许多,在实现Runnable接口的基础上做了许多其它操作,只复制目前我所明白的代码。
public class Thread implements Runnable {
//下面这些属性定好了,我们就不要去更改他们的值
    private volatile long nativePeer;
    volatile ThreadGroup group;//线程所在的组
    volatile String name;//线程名字
    volatile int priority;//优先级
    volatile long stackSize; //线程的堆大小,This has a highly platform-dependent interpretation. It may even be ignored completely.说什么这个值与平台相关,自己设置可能也会不起作用,觉得翻译有误,英文好的或者理解了它的可以说一下。
    Runnable target;
    private static int count = 0;
    private long id;//线程id,唯一标识,根据上面那个count属性值得到
    public enum State { //线程状态
        //线程被创建但还没start        
        NEW,
        //The thread may be run.
        RUNNABLE,
        //线程被阻塞,正在等待锁      
        BLOCKED,
        //等待
        WAITING,
        // 线程根据一个指定的时间在等待
        TIMED_WAITING,
        //线程终止
        TERMINATED
    }
//构造方法很多,写一个参数最多的
public Thread(ThreadGroup group, Runnable runnable, String threadName, long stackSize) {
        if (threadName == null) {
            throw new NullPointerException("threadName == null");
        }
        //除一个特殊的构造方法,其余都是这样子去调用create(),但意思都差不多,初始化那些属性
        create(group, runnable, threadName, stackSize);
    }
    /**
     * 实现Runnable的run(),如果线程有Runnable对象就运行它的run()没有就啥都不干。
     */
public void run() {
        if (target != null) {
            target.run();
        }
    }
    /**
     * 开启一个新线程,运行里面的run方法,
     * @throws IllegalThreadStateException 如果当前线程已经启动再调用就会抛此异常
     */
public synchronized void start() {···}
    /**
     * 有两个重载方法,还有一个是只有毫秒级别的,迫使发送这个消息的线程休息指定了的时长。
     * @param millis 毫秒
     * @param nanos 纳秒
     * @throws InterruptedException 如果当前线程已经被中断了就抛出InterruptedException,在异常抛出之前当前线程的中断状态奖杯清楚掉。
     */
public static void sleep(long millis, int nanos) throws InterruptedException {···}
    /**
     *跟sleep类似,有三个重载方法。区别在于它指当前线程暂停,直到调用此方法的那个线程方法执行完并结束,或者超过了我们给定的时长。满足任何一条当前线程就会苏醒。
     */
public final void join(long millis, int nanos) throws InterruptedException {···}
    /**
     *给线程发送一个中断请求,并且这个行为是依赖于这个线程的状态State
     *当线程处于等待锁的状态是无法被中断的,需要我们捕获InterruptedException操作推出run()方法。而对于不能捕获这个异常的,可以用这两个方法interrupted() isInterrupted()
     */
 public void interrupt() {···}
    /**
     * 静态方法,查看当前线程自己是否有即将中断的请求,并会消除中断标志
     */
 public static native boolean interrupted();
    /**
     * 常用于一个线程查看另一个线程的中断状态,并不会消除中断标志
     */
public native boolean isInterrupted();
    /**
     * 迫使一个calling线程的运行时间屈服与另一个线程的运行时间,为了实现依赖,我不懂。
     */
public static native void yield();

总结一下:
start()启动线程运行run();
sleep()和join()暂停线程;
interrupt()中断线程;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章