小白的Java多线程

线程周期:

1、新建状态:使用new关键字或者Thread类或其他子类创建一个线程对象之后,该线程就处于新建状态,他保持这个状态知道程序start()这个状态。

2、就绪状态:当线程对象调用了stsrt()方法后,这个线程就进入了就绪状态,就绪状态处于就绪队列中,要等待IVM中线程调度器的调度。

3、运行状态:如果线程获取了CPU资源,就可以执行run()方法,这个时候线程就处于运行状态,这个状态的线程是最复杂的,它可以变为:阻塞状态,死亡状态,就绪状态

4、阻塞状态:如果一个线程执行了sleep()、suspend()等方法,失去了所占用的资源之后,该线程就从运行状态进入阻塞状态,在重新获得设备资源后重新进入就绪状态。可以分为三种情况:

(1)等待阻塞:运行中的线程执行wait()方法,线程进入等待阻塞状态。

(2)同步阻塞:获取synchronized 同步锁失败。

(3)其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态

5、死亡状态:一个运行状态的线程完成任务或者其他终止条件发生时,这个线程就到终止死亡状态。


创建线程:

Runnable接口

Thread类本身

Callable和Future创建

线程池


Runnable:

package Thread;

public class thread_runnable {

    public static void main(String[] args) {

        RunnableDemo R1 = new RunnableDemo( "Thread-1");

        R1.start();

        RunnableDemo R2 = new RunnableDemo( "Thread-2");

        R2.start();

        }

    }

    class RunnableDemo implements Runnable {

        private Thread t;

        private String threadname;

        RunnableDemo(String name){

            threadname = name;

            System.out.println("创建线程" + threadname);

        }

        @Override

        public void run() {

            System.out.println("运行" + threadname);

            for(int i = 4; i > 0;i-- ){

                System.out.println("线程运行中"+threadname+"--"+i);

                try {

                    Thread.sleep(50);

                } catch (InterruptedException e) {

                }

                System.out.println("线程 " +  threadname + " 阻塞.");

            }

            System.out.println("线程 " +  threadname + " 退出.");

        }

        public void start() {

            System.out.println("就绪 " +  threadname );

            if (t == null) {

                t = new Thread (this, threadname);

                t.start ();

        }

    }

}

Thread类其实和Runnable差不多,本质上也是实现了Runnable接口。


线程池创建:

线程池提供了一个线程队列,队列中就保持着等待的线程,避免每次都要创建线程和销毁线程带来的额外成本,从而提高效率。


public class ThreadPoolExecutorTest {
    public static void main(String[] args) {
        //创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        ThreadPool threadPool = new ThreadPool();
        for(int i =0;i<5;i++){
            executorService.submit(threadPool);
        }
        executorService.shutdown();
    }
}
class ThreadPool implements Runnable {
    @Override
    public void run() {
        for(int i = 0 ;i<10;i++){
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

}


Thread.currentThread()和This的区别

Thread.currentThread()表示当前代码段正在被哪个线程调用

this表示的是当前对象,

实例代码:

package Thread;

public class Demo {

    public static void main(String[] args) {

        MyThread myThread=new MyThread();

        Thread thread=new Thread(myThread);

        thread.start();

    }

    public static class MyThread extends Thread {

        public MyThread() {

            System.out.println("当前线程的名字:"+Thread.currentThread().getName());

            System.out.println("当前线程的名字:"+this.getName());

        }

        @Override

        public void run() {

            //isAlive判断当前的线程是否处于活动状态

            System.out.println("当前线程的名字:"+Thread.currentThread().getName()+"   run=="+Thread.currentThread().isAlive());

            System.out.println("当前线程的名字:"+this.getName()+"  run=="+this.isAlive());

        }

    }

}

运行结果:

当前线程的名字:main

当前线程的名字:Thread-0

当前线程的名字:Thread-1   run==true

当前线程的名字:Thread-0  run==false  //这一块为false是因为仅仅运行了构造方法,并没有运行线程

 

你可能感兴趣的:(java)