JAVA之线程学习
Posted 蓉啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("一边玩手机"); } } }
参考:菜鸟教程
以上是关于JAVA之线程学习的主要内容,如果未能解决你的问题,请参考以下文章