二、Java多线程Thread线程基本用法和方法详解 - 简单实用

一、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 线程执行完毕之后我再执行");
  }
}

猜你喜欢

转载自blog.csdn.net/xp_zyl/article/details/81564219