线程的3种实现方式和线程生命周期

1.进程:系统进行资源分配和调用独立单元.每个进程都有自己独立内存空间和系统资源.
        (正在运行的程序)
        CPU时间片:进程中独立内存空间和系统资源.

2.线程:是进程中一条执行线路,每个线程都要执行一个任务.线程是共享进程中系统资源和内存空间.
        同一个进程中多个线程是竟争关系,互抢资源.

3.进程与线程的关系:一个进程可以1个到多个线程,但是一个线程只能属于一个进程.

4.实现线程:
    4.1:继承Thread类,重写run().
        eg:/**
 * 线程类
 * @author sx
 * @version 2019年12月4日
 */
public class MyThread extends Thread{
    /**
     * 任务方法
     */
    @Override
    public void run() {
        for (int i = 1; i <=10; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}

public static void main(String[] args) {
        //创建两个线程对象
        MyThread t1=new MyThread();
        MyThread t2=new MyThread();
        
        //启动线程
        t1.start();
        t2.start();
    }

4.2:实现Runnable接口,实现run()
    eg:/**
 * 任务类
 * @author sx
 * @version 2019年12月4日
 */
public class MyRunnable implements Runnable{
    /**
     * 任务方法
     */
    @Override
    public void run() {
        for (int i = 1; i <=10; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}

public static void main(String[] args) {
        //创建任务对象
        MyRunnable r1=new MyRunnable();
        MyRunnable r2=new MyRunnable();
        
        //将任务对象创建线程对象
        Thread t1=new Thread(r1,"线程A");
        Thread t2=new Thread(r2,"线程B");
        
        //启动线程
        t1.start();
        t2.start();
    }
4.3:(一般不用)实现Callable接口,重写call()方法.

5.继承Thread VS 实现Runnable接口的方式实现多线程
    5.1:代码简洁性:继承thread方式实现多线程,代码更简洁; 实现Runnable接口的方式实现多线                        程代码较麻烦点.
    5.2:可扩展性:继承thread方式的线程类不能再继承其他的类,只能实现其他接口,可扩展性较                    差;实现Runnable接口的任务类还可以继承其他的类,实现其他的接口,可扩展性                    较好.
    5.3:资源的共享性:继承thread方式实现多个线程执行同一任务,只能将这个任务资源定为静态                        的,可这样一来,虚内存,所以继承thread方式资源的共享性较差;实现                            Runnable接口的方式实现多个线程执行同一任务,只需要这多个线程共用一个任务对象就可以,所以实现Runnable接口的方式资源的共享性较好.

6.给线程取名:
    6.1:用系统默认分配的名称
    6.2:给线程取名:线程对象.setName("线程名");
    6.3:用构造方法给线程取名:
        /**
     * 用构造方法给线程取名
     * @param name
     */
    public MyThread(String name) {
        super(name);
    }

7.线程休眠:暂停当前的线程,让其在休眠时间内不参加资源的抢夺.
    语法:线程对象.sleep(毫秒); 
        Thread.sleep(毫秒);
    eg:public static void main(String[] args) throws InterruptedException {
        for (int i = 3; i >0; i--) {
            System.out.println(i);
            //让当前线程休眠一秒现输出
            Thread.sleep(5000);
        }
    }

8.线程优先级:优先级越高的线程抢占资源的概率越高,不一定能抢到;优先级越低的线程抢占资源的概率越低,但不一定能抢不到.   等级有1-10  
最低1  中间5  最大10
        语法:在启动线程之前设置线程优先级:线程对象.setPriority(int newPriority)
        public static void main(String[] args) {
        //创建两个线程对象
        MyThread t1=new MyThread();
        MyThread t2=new MyThread();
        
        //设置线程的名称
        t1.setName("线程A");
        t2.setName("线程B");
        
        //设置线程优先级
        t1.setPriority(Thread.MIN_PRIORITY);
        t2.setPriority(Thread.MAX_PRIORITY);
        
        //启动线程
        t1.start();
        t2.start();
    }

9.线程合并:让两条或以上的线程合并为一条线程,合并过来的线程优先执行完,再执行本来的线程.
    语法:线程对象.join();
    9.1:子线程合并到主线程中:
        eg:public static void main(String[] args) throws InterruptedException {
        //创建子线程
        MyThread1 t1=new MyThread1();
        //给线程取名
        t1.setName("子线程");
        //启动子线程
        t1.start();
        
        for (int i = 1; i <=100; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
            //当主线程运行到10时候,让子线程合并过来
            if (i==10) {
                t1.join();
            }
        }
    }

    9.2:子线程A合并到子线程B中
        eg:public class MyThread2 extends Thread{
    //声明线程对象,方便传值
    Thread t;
    
    /**
     * 任务方法
     */
    @Override
    public void run() {
        for (int i = 1; i <=100; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
            //当子线程B运行10时候,让子线程A合并过来
            if (i==10&&Thread.currentThread().getName().equals("子线程B")) {
                try {
                    t.join();//让子线程A合并过来
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

            public static void main(String[] args) throws InterruptedException {
        //创建子线程
        MyThread2 t1=new MyThread2();
        MyThread2 t2=new MyThread2();
        //给线程取名
        t1.setName("子线程A");
        t2.setName("子线程B");
        
        //调用子线程B的属性赋值
        t2.t=t1;
        
        //启动子线程
        t1.start();
        t2.start();
    }

10.线程礼让:让当前的线程暂停一下,再执行.
        语法:线程对象.yield();
            Thread.yield();
    eg:/**
 * 线程类
 * @author sx
 * @version 2019年12月4日
 */
public class MyThread extends Thread{
    /**
     * 任务方法
     */
    @Override
    public void run() {
        for (int i = 1; i <=100; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
            //线程B每输出一次就礼让一次A
            if (Thread.currentThread().getName().equals("子线程B")) {
                Thread.yield();
            }
        }
    }
}

11.守护线程(后台线程,精灵线程):守护线程用来守护非守护线程,如果所有非守护线程死亡了,守护线程自动死亡.eg:垃圾回收线程就是守护线程.
        语法:必须要在线程启动之前设置:线程对象.setDaemon(true); 
        eg:public static void main(String[] args) {
        //创建线程对象
        MyThread t1=new MyThread();
        //设置线程名称 
        t1.setName("守护线程");
        //设置当前的子线程为守护线程
        t1.setDaemon(true);
        //启动线程
        t1.start();
        
        for (int i = 1; i <=100; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }

12.线程生命周期
    12.1:新建状态(新生状态):当线程刚被创建时,线程就处于新建状态.
    12.2:就绪状态:当线程调用start()后或阻塞线程的时间到了或被唤醒了,它就处理就绪状态.
    12.3:运行状态:当就绪状态的线程抢到CPU时间片,调用run(),它就处理运行状态.
    12.4:阻塞状态:当运行的线程调用sleep(),wait()方法时,线程就处于阻塞.
    12.5:死亡状态:当线程的任务执行完了或当线程异常终止了,再无法运行时就叫死亡状态.

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程和进程的生命周期有一些区别。每个独立的线程有自己的程序运行入口、顺序执行序列和程序的出口,但线程不能独立执行,必须依赖于应用程序提供的多个线程执行控制。相对于进程而言,线程更接近于执行体的概念。它可以与同一进程中的其他线程共享数据,但拥有自己的栈空间和独立的执行序列。 线程的生命周期包括以下几个状态: 1. 就绪状态:线程处于可运行的状态,但CPU时间片还没有轮到该线程执行。线程在就绪状态等待被调度执行。 2. 运行状态:线程处于可运行状态,且CPU时间片轮到该线程,线程正在执行代码。 3. 阻塞状态:线程不具备运行条件,正在等待某个事件的完成,比如等待某个输入/输出操作完成。在这种情况下,线程会暂时进入阻塞状态,直到满足特定条件才能继续执行。 总结来说,线程的生命周期包括就绪、运行和阻塞这三个状态,而进程的生命周期包括创建、就绪、运行、挂起和终止等多个状态。线程是进程中的执行单位,相比进程具有更加轻量级和灵活的特点。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [进程与线程的生命周期](https://blog.csdn.net/runrun117/article/details/80291397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [进程和多线程的生命周期](https://blog.csdn.net/lzh_99999/article/details/104550961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值