java创建线程(Thread)的方式

2020-10-26  本文已影响0人  陈萍儿Candy

线程的执行:调用Thread中的start方法,java虚拟机会调用其run方法
见Thread的start方法注释

/**
     * Causes this thread to begin execution; the Java Virtual Machine
     * calls the <code>run</code> method of this thread.
     * <p>
     * The result is that two threads are running concurrently: the
     * current thread (which returns from the call to the
     * <code>start</code> method) and the other thread (which executes its
     * <code>run</code> method).
     * <p>
     * It is never legal to start a thread more than once.
     * In particular, a thread may not be restarted once it has completed
     * execution.
     *
     * @exception  IllegalThreadStateException  if the thread was already
     *               started.
     * @see        #run()
     * @see        #stop()
     */
    public synchronized void start() {

Thread类的run方法

/**
     * If this thread was constructed using a separate
     * <code>Runnable</code> run object, then that
     * <code>Runnable</code> object's <code>run</code> method is called;
     * otherwise, this method does nothing and returns.
     * <p>
     * Subclasses of <code>Thread</code> should override this method.
     *
     * @see     #start()
     * @see     #stop()
     * @see     #Thread(ThreadGroup, Runnable, String)
     */
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }

创建Thread方法有两种:一从Thread类中派生的子类,使用较少
二是从Runnable接口构造Thread类,比较常用

1.Thread类的派生子类
由于Thread类本身即实现了接口Runnable,只是其run方法没有任何功能,
因此我们只需要继承Thread,重写自己的run()方法即可。

public class Thread1 extends Thread{

    private Object object = new Object();
    
    @Override
    public void run() {
        super.run();
        System.out.println("thread1");
        System.out.println(this.getState());
        System.out.println(this.getThreadGroup().getName());
        Log.i("cyp", "run: "+this.getThreadGroup().activeCount());
        synchronized (object) {
            try {
//                object.wait();
                object.wait(10000);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

2.提供一个Runnable对象
由于Runnable接口只有一个方法-run(),因此继承该接口,实现run()方法,
再将其作为参数传递给Thread的构造器即可。

class Test1Runnable implements Runnable{

    private LockObject lockObject;

    public Test1Runnable(LockObject lockObject) {
        this.lockObject = lockObject;
    }

    @Override
    public void run() {
        synchronized (lockObject) {
            try {
                Log.i("cyp", "test1Runnable:synchronized ");
                Log.i("cyp","test1Runnable wait 方法执行前"+Thread.currentThread().getName()+",state:"+Thread.currentThread().getState());
                lockObject.wait(10000);
                Log.i("cyp", "test1Runnable wait 方法执行后"+Thread.currentThread().getName()+",state:"+Thread.currentThread().getState());
                Thread.sleep(10000);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

把Test1Runnable传入到Thread中:

Test1Runnable runnable = new Test1Runnable(lockObject);
        one = new Thread(runnable);
        one.start();

以上就是创建线程的两种方式;
下面是对错误方式的记录:
(1):调用Thread的run方法,应该是调用start方法,让java虚拟机去调用run方法

 Test1Runnable runnable = new Test1Runnable(lockObject);
        one = new Thread(runnable);
//        one.start();
        // 测试run   只是调用了Test1Runnable的run方法,没有创建子线程,是在主线程main中执行
        one.run();

(2):直接执行Test1Runnable的run方法,同样也是没有创建子线程,是在主线程main中执行;

Test1Runnable runnable1 = new Test1Runnable(lockObject);
        runnable1.run();

在主线程main中不要执行耗时操作

上一篇下一篇

猜你喜欢

热点阅读