一、Thread类方法:sleep,currentThread
1.sleep方法:是Thread的类方法,主要作用是控制当前线程阻塞N毫秒。
package com.xiangping.thread.demo;
/**
* 1.Thread类方法:sleep方法
*
* @author 向平
* @version $Id: Test.java, v 0.1 2018年8月10日 上午10:52:45 向平 Exp $
*/
class XPThread extends Thread {
/**
* @see java.lang.Thread#run()
*/
@Override
public void run() {
long start = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + "-----run() --start");
// 让这个子线程沉睡3秒
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
long end = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + "-----run() --end\n执行了" + ((end-start)/1000)+"秒");
}
}
public class Test {
public static void main(String[] args) {
Thread xpThread = new XPThread();
xpThread.start();
}
}
执行结果:
Thread-0-----run() --start
Thread-0-----run() --end
执行了3秒
2.currentThread:获取当前执行的线程
public class Test {
public static void main(String[] args) {
Thread xpThread = new XPThread();
xpThread.start();
Thread thread = Thread.currentThread();
System.out.println(thread);
}
}
3.yield():暂停当前执行的线程对象,并执行其他线程。这个暂停是会放弃CPU资源的,并且放弃CPU的时间不确定,有可能刚放弃,就获得CPU资源了,也有可能放弃好一会儿,才会被CPU执行。代码如下:
/**
*
* @author 向平
* @version $Id: Test.java, v 0.1 2018年8月10日 上午10:52:45 向平 Exp $
*/
class XPThread extends Thread {
/**
* @see java.lang.Thread#run()
*/
@Override
public void run() {
long beginTime = System.currentTimeMillis();
int count = 0;
for (int i = 0; i < 500000; i++) {
Thread.yield();
count = count + i + 1;
}
long endTime = System.currentTimeMillis();
System.out.println("总时间是:" + (endTime - beginTime) + "毫秒!");
}
}
public class Test {
public static void main(String[] args) {
XPThread mt = new XPThread();
mt.start();
}
}
执行结果:
总时间是:3464毫秒!
总时间是:3224毫秒!
总时间是:3222毫秒!
总时间是:3732毫秒!
总时间是:3187毫秒!
总时间是:3134毫秒!
总时间是:3354毫秒!
二、常用的实例方法
- getName():获取线程的名字。(简单不写代码了)
- getId():获取线程的Id。(简单不写代码了)
- getPriority()、setPriority():获取和设置线程的优先级。(简单不写代码了)
- isDaemon()、setDaemon():获取线程是否为守护线程,设置线程为守护线程。(简单不写代码了)
- start():启动并执行线程。(简单不写代码了)
- run():线程调用 start() 方法之后,线程开始运行了,执行的方法。(简单不写代码了)
- isAlive(): 是测试线程是否处于"活动状态"。代码如下:
package com.xiangping.thread.demo;
/**
*
* @author 向平
* @version $Id: Test.java, v 0.1 2018年8月10日 上午10:52:45 向平 Exp $
*/
class XPThread extends Thread {
/**
* @see java.lang.Thread#run()
*/
@Override
public void run() {
System.out.println("---"+Thread.currentThread().isAlive());
}
}
public class Test {
public static void main(String[] args) {
Thread thread = new XPThread();
System.out.println(thread.isAlive());
thread.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
System.out.println(thread.isAlive());
}
}
执行结果:
false
---true
false
- interrupt():设置中断标识,但是这个方法本身是不能直接中断线程的。(简单不写代码了)
- isInterrupted():用这个方法去检测线程是否有设置中断标识。(简单不写代码了)
- 讲解 join()方法之前要对 wait()/notify()/notifyAll() 机制已熟练掌握。(简单不写代码了)
- join():等待线程销毁。比如 main 线程执行的时间是5秒,有一个子线程执行的时间是10秒,主线程又需要依赖子线程执行完的结果,这时怎么办?类似于生产者和消费者模式,创建缓冲区,把子线程执行的结果存放到缓冲区,然后告诉 main 线程取拿取记过,这样就不会浪费 main 线程的时间了。也可以join()方法就可以实现。代码如下:
class XPJoinThread extends Thread{
public void run(){
try{
int secondValue = (int)(Math.random() * 10000);
System.out.println(secondValue);
Thread.sleep(secondValue);
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) {
XPJoinThread mt = new XPJoinThread();
mt.start();
try {
mt.join();
} catch (InterruptedException e) {}
System.out.println("我是 "+Thread.currentThread().getName()+" 线程,当 mt 线程执行完毕之后我再执行");
}
}