Java中线程的创建和生命周期

        在操作系统中能(同时)运行多个任务(程序),每一个应用程序就是进程,多进程的作用不是提高执行速度,而是提高 CPU 的使用率。进程和进程之间的内存是独立的。在一个程序中同时运行的多个独立流程,每一个独立的流程就是一个线程,多线程并不是在同一个时间有多个线程真正的同时执行,也是 cpu 会给不同的线程轮流分配时间片,分配的速度很快,给人的感觉就是同时执行.多线程的作用不是为了提高执行速度,而是提高应用程序的使用率。线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。每个进程是一个应用程序,都有独立的内存空间同一个进程中的线程共享其进程中的内存和资源,共享的内存是堆内存和方法区内存,栈内存不共享,每个线程有自己独立的栈。

线程的创建:

        线程的开发有两种,一种是继承Thread类,一种是实现Runnable接口,启动线程需要调用start()方法,然后执行线程对象的run()方法中的代码。

public class TestThread {
    public static void main(String[] args){
        /*方式一*/
        Thread thread1 = new MyThread01();
        thread1.start();
        
        /*方式二*/
        Runnable rable = new MyThread02();
        Thread thread2 = new Thread(rable);
        thread2.start();
    }
}
/*实现方式一、继承Thread类*/
class MyThread01 extends Thread{
    public void run(){
        for(int i=0;i<100;i++){
            System.out.println("------线程1----------");
        }
    }
}
/*实现方式二、通过实现Runnable接口*/
class MyThread02 implements Runnable{
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            System.out.println("---------线程2--------");
        }
        
    }
    
}

线程的完整生命周期:

线程的执行通常是Java虚拟机来调度的,调度线程发送给cpu指令,取得cpu的使用权,cpu在一个时刻只能执行一条指令,线程得到了cpu的时间片,也就是使用权后再继续执行。

六种装态:

起始状态:采用new对象创建完成时;

可运行状态:线程对象调用调用了start()方法,进入到可运行状态,等待获取时间片,运行;

运行状态:得到CPU的时间片,执行中,运行中可能会有优先级更高的线程需要执行,丢失时间片回到可运行状态,再等待获取时间片;

阻塞状态:发生阻塞事件时,如当前线程调用Thread.sleep()方法、或者当前线程调用另一线程的join()的方法,或者调用了Thread.yield()方法时,当前线程都会进入到阻塞状态。直到解除阻塞状态,重新进入到到可运行状态,等待运行;

锁池状态:当前线程执行到有一个对象有synchronized 标记的方法时,另一个线程已经在执行这个方法,当前线程进入到锁池状态,只有从新拿到该对象锁标记之后,从锁池中放出,重新进入到可运行状态,等待抢夺时间片再继续执行。在线程安全中会说到。

终止状态:退出了run()方法,就是终止状态了。

这就是一个线程的完整的生命周期。

Thread.sleep()方法:一个运行状态的线程调用到该方法,会放弃CPU时间片,交给其他线程执行,本线程会阻塞状态,放弃时间达到sleep设置的时间后重新再进入到可运行状态。

join()的方法:A线程调用了B线程的join方法后,A 立即进入到阻塞状态,时间片让给B,线程B执行,直到线程B执行结束了,A线程才会重新进入到可运行状态,抢夺时间片。

Thread.yield()方法:A线程调用了yield()方法,会放弃CPU的时间片,交给同优先级的线程有执行的机会,但是它会立即又进入到可运行状态,可能还会抢到CPU的时间片,继续执行,也就是说A线程刚放弃CPU的时间片,没有等到另一个线程抢到他会再次抢到cpu的时间片,获得执行机会。

调度方式:

目前有两种调度模型:分时调度模型和抢占式调度模型,Java使用抢占式调度模型。

分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片

抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个。因此线程中可以调用设置优先级别。优先级别越高,得到CPU时间片点的机会越多,越先执行完。

public class TestThread {
	public static void main(String[] args){
		/*方式一*/
		Thread thread1 = new MyThread01();
		thread1.start();
		
		/*方式二*/
		Runnable rable = new MyThread02();
		Thread thread2 = new Thread(rable);
		/*1、设置优先级需要再线程执行前设置,启动后不能再设置*/
		/*最高级*/
//		thread2.setPriority(Thread.MAX_PRIORITY);
		/*最低级*/
//		thread2.setPriority(Thread.MIN_PRIORITY);
		/*标准级,默认的*/
		thread2.setPriority(Thread.NORM_PRIORITY);
		thread2.start();
	}
}

下一篇说一下线程并发以及线程安全

      

猜你喜欢

转载自blog.csdn.net/qq_24126893/article/details/80557034