美文网首页
Runnable与Thread类详解

Runnable与Thread类详解

作者: eliteTyc | 来源:发表于2020-03-05 13:46 被阅读0次

Runnable类是一个接口,包含一个抽象方法,run

public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

Thread类实现了Runnable接口同时包含以下方法

  • run方法,需要在线程中执行的逻辑
  • currentThread方法,获取当前所在的线程,返回为一个Thread对象
  • yield 方法,暂时释放自己持有的cpu资源
  • start方法 启动一个线程,并执行当前线程的run方法
  • join方法 a线程调用b线程的join方法,a线程会阻塞,直到b线程执行结束,a线程会继续执行
  • stop方法(已过时),当执行stop方法时,强制停止当前线程
  • sleep方法,让当前线程阻塞指定毫秒数
  • isAlive方法 判断当前线程是否存活,返回true或者false
  • setPriority方法,设置线程的优先级
/**
    * The minimum priority that a thread can have.
    * 最小优先级
    */
   public final static int MIN_PRIORITY = 1;

  /**
    * The default priority that is assigned to a thread.
     * 默认优先级
    */
   public final static int NORM_PRIORITY = 5;

   /**
    * The maximum priority that a thread can have.
     * 最大优先级
    */
   public final static int MAX_PRIORITY = 10;
  • getPriority方法,获取当前线程的优先级
  • Thread.State,Thread内部枚举类,用来记录当前线程的生命周期
public enum State {
        // 线程新建了,但是还没有start
        NEW,
       // 线程执行起来了,就是调用了线程的start方法之后
        RUNNABLE,
      // 阻塞状态,当多个线程执行同一个同步代码块儿时,同步代码快被其他线程占用,当前线程就为阻塞态
        BLOCKED,
      // 等待 wait(),join()等方法调用了之后,即不知道等待多久
        WAITING,
      // 带时间的等待,wait(time),join(time)方法调用了之后,即知道等待多久
        TIMED_WAITING,
      // 线程执行完成
        TERMINATED;
    }

创建线程的方式
1.继承Thread方式实现,重写run方法

class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        for (int i = 0; i < 100; i++) {
            if (i%2==0){
                System.out.println(i);
            }
        }
    }
}

2.实现Runnable接口的方式实现

/**
 * create by elitetyc
 * date:2020/3/5
 * desc:
 * 1.创建类实现Runnable接口
 * 2.实现run方法
 * 3.创建实例对象
 * 4.将实例对象传递给Thread构造函数,新建Thread对象,并调用start方法
 **/

//步骤1
public class RunnableTest implements Runnable {

//    步骤2
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i%2==0){
                System.out.println(i);
            }

        }
    }

    public static void main(String[] args) {
//        步骤3
        RunnableTest runnableTest = new RunnableTest();
//        步骤4
        new Thread(runnableTest).start();
    }
}

比较两种创建线程的方式
开发中优先选择实现Runnable方式来创建线程

  • 因为类为单继承,如果使用继承Thread方式创建线程了,可能导致该类不能再继承其他类
  • 多个线程之间又共享数据时,使用实现Runnable接口的方式可以天然达到共享数据的效果(例如卖票系统)
/**
 * create by elitetyc
 * date:2020/3/5
 * desc:创建3个窗口卖票,一共100张票
 **/


public class RunnableWindowTest{
    public static void main(String[] args) {
        RunnableWindow runnableWindow = new RunnableWindow();
        new Thread(runnableWindow,"窗口1").start();
        new Thread(runnableWindow,"窗口2").start();
        new Thread(runnableWindow,"窗口3").start();

    }
}


class RunnableWindow implements Runnable {

    private int ticket=100;

    @Override
    public void run() {
//        同步锁,防止多线程安全问题
        synchronized (this){
            while (true){
                if (ticket>0){
                    System.out.println(Thread.currentThread().getName()+":卖出票号"+ticket);
                    ticket--;
                }else {
                    break;
                }
            }
        }
    }


}

相关文章

网友评论

      本文标题:Runnable与Thread类详解

      本文链接:https://www.haomeiwen.com/subject/udcblhtx.html