JAVA之线程学习

进程:一个应用程序在处理机上的一次执行过程,它是一个动态的概念,包含一个或多个线程。

线程:是进程的一个实体,是CPU调度和分派的基本单位。

一个线程的生命周期:

  新建状态(start())

  就绪状态(start())

       运行状态(run())

       阻塞状态()

       死亡状态(stop()或destory())

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

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

  • 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。

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

线程优先级:Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。

默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。

Java线程的几个重要方法

1.start()与run():实现线程类时无论是继承Thread类还是实现Runnable接口,都要实现run()方法          实现具体的线程业务逻辑,但是真正启动线程类时要注意使用start()方法,调用         run()方法并不会启动一个线程去执行,只会当成普通的类方法来执行。
         所以start()方法会启动2个线程运行,而run()方法只会启动一个线程。

2.yield():暂停当前正在执行的线程对象,并执行其他线程。

      调用方法之后线程会立即释放占用的资源,CPU可以转向执行其它的线程。但是具体执      行哪个线程并不确定,所以也有可能下次还是执行当前线程。

3.join():暂停当前正在执行的线程对象,并执行其他线程。

4.sleep():在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)

创建线程的方法

1.通过继承Thread类

package com.demo.thread;

/*1.创建多线程:  继承Thread方法     重写run():查看Thread源码有个run方法
 *2.使用线程:创建子类对象,对象.start()启动
 *继承Thread类方式的缺点:如果一个类已经从一个类继承,则再无法继承Thread类
 * */
class Thread1 extends Thread{
    @Override
    public void run() {
        //线程体,运行一切从run开始
        for(int i=0;i<5;i++){
            System.out.println("兔子跑了"+i+"");
        }
    }
}
class Thread2 extends Thread{
    @Override
    public void run() {
        //线程体,运行一切从run开始
        for(int i=0;i<5;i++){
            System.out.println("乌龟跑了"+i+"");
        }
    }
}
public class ThreadTest{
    public static void main(String[] args) {
        //创建子类对象
        Thread1 thread1= new Thread1();
        Thread2 thread2= new Thread2();
        //调用start方法,启动线程
        thread1.start();
        thread2.start();
    }
}

2.实现Runnable接口

package com.demo.thread;
/*使用Runnable创建线程:避免单继承的局限性,便于共享资源
 * 1.类实现Runnable接口+重写run()----->真实角色类
 * 2.启动多线程,使用静态代理
 *     1)创建真实角色
 *  2)创建代理角色+真实角色引用
 *  3)调用.start()启动线程
 * 
 * 
 * */
class Runna implements Runnable{

    @Override
    public void run() {
        for(int i=0;i<1000;i++){
            System.out.println("一边吃饭");
        }
        
    }
    
}
public class RunnableTest {
        public static void main(String[] args) {
//             1)创建真实角色
            Runna runna = new Runna();
//             2)创建代理角色+真实角色引用
            Thread proxy = new Thread(runna);
//             3)调用.start()启动线程
            proxy.start();
            
            for(int i=0;i<1000;i++){
                System.out.println("一边玩手机");
            }
        }
}

                            参考:菜鸟教程

                                                详细线程介绍

原文地址:https://www.cnblogs.com/liurg/p/8280701.html