Java多线程二:Thread类

Java多线程:Thread深入研究


介绍

Thread类由其名字可知其是一个线程类,java创建线程可以通过该类.

A thread is a thread of execution in a program. The Java Virtual Machine allows an application  
to have multiple threads of execution running concurrently.

备注:Thread类实现了Runnable接口.

Thread类常用静态方法

//返回当前线程的线程组中活动线程的数目
public static int activeCount();
//返回对当前正在执行的线程对象的引用
public static native Thread currentThread();
//测试当前线程是否已经中断
public static boolean interrupted()
//在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),是要释放资源的
public static native void sleep(long millis)
//在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),是要释放资源的
public static void sleep(long millis, int nanos)
//暂停当前正在执行的线程对象,并执行其他线程.
public static native void yield()

Thread常用普通方法

最核心的两个方法
//启动线程(是有操作系统底层支持的方法)
public synchronized void start()
//需要被覆盖写业务代码的方法
public void run();

//强行抢占CPU资源
public final void join();
public final synchronized void join(long millis)
public final synchronized void join(long millis, int nanos)
//Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever.

//设置线程的优先级(范围在1~10,通常 NORM_PRIORITY = 5)
public final void setPriority(int newPriority) //优先级并不是绝对的能改变执行顺序,最终由操作系统调度
//默认就提供了name属性
public final void setName(String name)
//设置线程为守护线程还是用户线程(This method must be invoked before the thread is started.)
public final void setDaemon(boolean on)


//判断线程是否被打断
public boolean isInterrupted()
//判断线程是否存活
public final native boolean isAlive()


还有一系列的构造方法
public Thread()
public Thread(Runnable target)//常用
public Thread(Runnable target, String name)//常用
public Thread(ThreadGroup group, Runnable target)
. . .

废弃方法

//以下三个是过时方法,不推荐使用
public final void stop()//该方法具有固有的不安全性
public void destroy()//该方法最初用于破坏该线程,但不作任何清除
public final void suspend()//该方法已经遭到反对,因为它具有固有的死锁倾向。

那么该如何停止一个线程呢?使用标识位来判断,退出run代码块。

关于启动线程理解

线程的最终启动是依赖操作系统的,而非普通的java方法就能启动.

线程的执行是需要获得CPU执行权才能够执行,而线程是通过抢占式获得CPU执行权的.

查看start()方法源码

public synchronized void start() {

    //如果线程已经启动了就不能再启动,否则报错。
    if (threadStatus != 0)
        throw new IllegalThreadStateException();
    group.add(this);
    boolean started = false;
    try {
        start0();//操作系统本地方法,由C/C++编写
        started = true;
    } finally {
        //. . .
    }
}

private native void start0();//操作系统本地方法

多线程的随机性和不可预测性

public class ThreadApp {
    public static void main(String[] args) {

        PrintNumThread printNumThread = new PrintNumThread(10);
        printNumThread.setName("test线程");
        printNumThread.start();// 该线程一定要先于下面的方法调用
        // printNumThread.run();//如果直接调用run方法,那么只是一个普通的调用方法,并没有启动线程来执行run方法。
        printNum(10);

    }

    private static void printNum(int num) {
        for (int i = 0; i < num; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + (i + 1));
        }
    }

}

备注:从该例中也能看出,java启动运行时本身就启动了一个主线程.
备注:每次执行的结果都是不同的也是不可预测的.

参考

1、[JDK 文档参考](JDK 文档参考)
2、http://www.cnblogs.com/dolphin0520/p/3920357.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值