Java总结(九)——(线程模块 一(线程的创建(方法一)与启动,线程状态与生命周期,进程与线程))
2018-02-19 19:47
781 查看
一.进程与线程进程:每一个独立运行的程序称为一个进程
线程:线程时一个进程内部的一条执行路径,Java虚拟机允许程序并发的运行多个执行路径*进程中执行运算的最小单位——>线程<——处理机分配
进程与线程的区别:(1)进程有独立的运行地址空间,一个进程崩溃后不会影响到其他的进程,而线程只是 一个进程中的一个执行路径,如果有一条线程奔溃了,可能会影响到进程中的的其他线程(2)线程有自己的栈和局部变量,多个线程共享同一进程的地址空间(3)一个进程至少有一个线程
多线程(1)多线程 就是在一个进程中创建多个线程,每个线程完成一个任务(2)优点:<1>多线程技术使程序的响应速度更快<2>提高资源利用率<3>程序设计更加简单
多线程的执行特性(1)随机性(一部执行):谁“抢”到CPU,谁执行(2)宏观上同时执行,微观上同一时刻只能执行一个线程(多核除外)二.线程的创建和启动1.两种创建 新线程的方式<1>第一种方式:将类声明为Thread的子类并重写run()方法格式:class MygThread extends Thread{Public void run(){线程具体执行代码}} 创建此线程类的实例并启动:MyThread thread1=new MyThread()Thread1.start(); //启动线程2.线程的基本使用方法(1)public void start():是该线程开始执行(2)public static Thread currentThread(): 返回对当前正在执行的线程对象的引用(3)public final void seetName(String str):改变线程名称(4)public final void setDDeamon(boolean on):将该线程标记为守护线程或用户线程(5)public static void sleep(long millis):线程休眠指定毫秒数(6)public final void join():当前线程必须等待,直到调用join()方法的线程对象所对应的线程运行完毕,当前线程才恢复执行(7)public static void yield():线程礼让,但操作系统可以忽略这个礼让请求例1(以创建线程为例): 创建线程:package thread; public class ThreadDemo extends Thread { public ThreadDemo() { } public ThreadDemo(String name) { super(name); } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"循环输出i="+i); } super.run(); }}实例化线程测试:package thread; public class ThreadTest { public static void main(String[] args) { ThreadDemo thread=new ThreadDemo("线程A——>"); thread.start(); ThreadDemo thread1=new ThreadDemo("线程B——>"); thread1.start(); } }运行结果:线程A——>循环输出i=0线程B——>循环输出i=0线程A——>循环输出i=1线程A——>循环输出i=2线程A——>循环输出i=3线程B——>循环输出i=1线程A——>循环输出i=4线程B——>循环输出i=2线程B——>循环输出i=3线程A——>循环输出i=5线程B——>循环输出i=4线程A——>循环输出i=6线程B——>循环输出i=5线程A——>循环输出i=7线程B——>循环输出i=6线程A——>循环输出i=8线程B——>循环输出i=7线程B——>循环输出i=8线程A——>循环输出i=9线程B——>循环输出i=9例2(以线程中的休眠方法为例):创建线程:package thread; public class ThreadDemo extends Thread { public ThreadDemo() { } public ThreadDemo(String name) {super(name);} @Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"循环输出i="+i);}super.run();}}测试休眠方法:package thread; public class ThreadTest { public static void main(String[] args) {ThreadDemo thread=new ThreadDemo("线程A——>");thread.start();ThreadDemo thread1=new ThreadDemo("线程B——>");thread1.start();for (int i = 0; i < 10; i++) {try {Thread.sleep(1000);//当前线程休眠1000ms} catch (InterruptedException e) {System.out.println("捕获到的已常为:"+e.getMessage());}System.out.println(Thread.currentThread().getName()+"线程——>i="+i);}} }运行结果:线程A——>循环输出i=0线程A——>循环输出i=1线程A——>循环输出i=2线程A——>循环输出i=3线程A——>循环输出i=4线程A——>循环输出i=5线程A——>循环输出i=6线程A——>循环输出i=7线程A——>循环输出i=8线程A——>循环输出i=9main线程——>i=0main线程——>i=1main线程——>i=2main线程——>i=3main线程——>i=4main线程——>i=5main线程——>i=6main线程——>i=7main线程——>i=8main线程——>i=9当前线程运行所用时间:10s例3(以线程中的join方法为例):创建线程类:package thread; public class ThreadDemo extends Thread { public ThreadDemo() { } public ThreadDemo(String name) {super(name);} @Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println(Thread.currentThread().getName()+"循环输出i="+i);}super.run();}}测试join()方法类:package thread; public class ThreadModth {public static void main(String[] args){ThreadDemo thread=new ThreadDemo("线程一——>");thread.start();for (int i = 1; i < 20; i++) {if(i==10){try {thread.join();//当前线程休眠, 直到调用join方法的线程 执行完毕,当前线程开始执行} catch (InterruptedException e) {System.out.println("捕获到的异常为:"+e.getMessage());}}System.out.println(Thread.currentThread().getName()+"线程——>i="+i);}} }运行结果: main线程——>i=1main线程——>i=2线程一——>循环输出i=0main线程——>i=3线程一——>循环输出i=1main线程——>i=4线程一——>循环输出i=2main线程——>i=5线程一——>循环输出i=3main线程——>i=6线程一——>循环输出i=4main线程——>i=7线程一——>循环输出i=5main线程——>i=8线程一——>循环输出i=6main线程——>i=9线程一——>循环输出i=7线程一——>循环输出i=8线程一——>循环输出i=9线程一——>循环输出i=10线程一——>循环输出i=11线程一——>循环输出i=12线程一——>循环输出i=13线程一——>循环输出i=14线程一——>循环输出i=15线程一——>循环输出i=16线程一——>循环输出i=17线程一——>循环输出i=18线程一——>循环输出i=19main线程——>i=10main线程——>i=11main线程——>i=12main线程——>i=13main线程——>i=14main线程——>i=15main线程——>i=16main线程——>i=17main线程——>i=18main线程——>i=19二.线程的生命周期(状态转换)1.线程的状态2.要想实现多线程,必须在主线程中创建新的线程对象,任何线程都具有五种状态:创建,就绪,运行,阻塞,终止状态图:
3.线程的停止(1)如果线程的run()方法中执行的是一个重复执行的循环,可以提供一个标记来控制循环是否执行吧(2)如果线程因为执行sleep()方法或是wait()方法而进入了阻塞状态,此时想要停止它,可以使用interrupt(),程序会抛出InterruptException异常(3)如果程序因为输入输出的等待而阻塞,基本上 必须等待输入输出动作完成后才能离开阻塞状态,无法用interrupt() 方法来使线程离开run()方法,要想离开,只能通过引发一个异常例1.(停止循环线程)创建循环线程:package stopthread; public class LoopThread extends Thread{private boolean flag=true;//设置线程停止标志 public void setFlag(boolean flag) {this.flag = flag;} @Overridepublic void run() {while(flag){System.out.println("当前 线程正在运行....");}} }测试停止循环线程:package stopthread; public class StopLoop { public static void main(String[] args) {long startTime= System.currentTimeMillis();//开始线程时间LoopThread lt=new LoopThread();lt.start();try {Thread.sleep(3000);//当前线程休眠3000ms} catch (InterruptedException e) {System.out.println("捕获到的异常为:"+e.getMessage());}lt.setFlag(false);System.out.println("end............");long destTime=System.currentTimeMillis();//结束线程时间System.out.println("执行完线程共用时间:"+(destTime-startTime)/1000+"s"); } }运行结果:当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行..........................................end............执行完线程共用时间:3s例2.(以中断休眠为例 )创建休眠中断线程:package stopthread; public class InterruptThread extends Thread{private String name; public InterruptThread(String name) {super(name);this.name = name;} @Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"开始执行");System.out.println("准备休息5s");long startTime=System.currentTimeMillis();// 线程开始时间try {Thread.sleep(5000);} catch (InterruptedException e) {System.out.println("为什么要叫醒我?");} long destTime=System.currentTimeMillis();//线程完毕时间System.out.println(Thread.currentThread().getName()+"执行完毕");System.out.println("执行线程所用时间:"+(destTime-startTime)/1000+"s"); }}测试终端休眠:package stopthread; public class StopInterrupt { public static void main(String[] args) {InterruptThread it=new InterruptThread("线程一——>");it.start();try {Thread.sleep(2000);//当前线程休眠2000ms} catch (InterruptedException e) {e.printStackTrace();}it.interrupt();//打断这个线程,使之抛出InterruptedException异常} }运行结果:线程一——>开始执行准备休息5s为什么要叫醒我?线程一——>执行完毕执行线程所用时间:2s
线程:线程时一个进程内部的一条执行路径,Java虚拟机允许程序并发的运行多个执行路径*进程中执行运算的最小单位——>线程<——处理机分配
进程与线程的区别:(1)进程有独立的运行地址空间,一个进程崩溃后不会影响到其他的进程,而线程只是 一个进程中的一个执行路径,如果有一条线程奔溃了,可能会影响到进程中的的其他线程(2)线程有自己的栈和局部变量,多个线程共享同一进程的地址空间(3)一个进程至少有一个线程
多线程(1)多线程 就是在一个进程中创建多个线程,每个线程完成一个任务(2)优点:<1>多线程技术使程序的响应速度更快<2>提高资源利用率<3>程序设计更加简单
多线程的执行特性(1)随机性(一部执行):谁“抢”到CPU,谁执行(2)宏观上同时执行,微观上同一时刻只能执行一个线程(多核除外)二.线程的创建和启动1.两种创建 新线程的方式<1>第一种方式:将类声明为Thread的子类并重写run()方法格式:class MygThread extends Thread{Public void run(){线程具体执行代码}} 创建此线程类的实例并启动:MyThread thread1=new MyThread()Thread1.start(); //启动线程2.线程的基本使用方法(1)public void start():是该线程开始执行(2)public static Thread currentThread(): 返回对当前正在执行的线程对象的引用(3)public final void seetName(String str):改变线程名称(4)public final void setDDeamon(boolean on):将该线程标记为守护线程或用户线程(5)public static void sleep(long millis):线程休眠指定毫秒数(6)public final void join():当前线程必须等待,直到调用join()方法的线程对象所对应的线程运行完毕,当前线程才恢复执行(7)public static void yield():线程礼让,但操作系统可以忽略这个礼让请求例1(以创建线程为例): 创建线程:package thread; public class ThreadDemo extends Thread { public ThreadDemo() { } public ThreadDemo(String name) { super(name); } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"循环输出i="+i); } super.run(); }}实例化线程测试:package thread; public class ThreadTest { public static void main(String[] args) { ThreadDemo thread=new ThreadDemo("线程A——>"); thread.start(); ThreadDemo thread1=new ThreadDemo("线程B——>"); thread1.start(); } }运行结果:线程A——>循环输出i=0线程B——>循环输出i=0线程A——>循环输出i=1线程A——>循环输出i=2线程A——>循环输出i=3线程B——>循环输出i=1线程A——>循环输出i=4线程B——>循环输出i=2线程B——>循环输出i=3线程A——>循环输出i=5线程B——>循环输出i=4线程A——>循环输出i=6线程B——>循环输出i=5线程A——>循环输出i=7线程B——>循环输出i=6线程A——>循环输出i=8线程B——>循环输出i=7线程B——>循环输出i=8线程A——>循环输出i=9线程B——>循环输出i=9例2(以线程中的休眠方法为例):创建线程:package thread; public class ThreadDemo extends Thread { public ThreadDemo() { } public ThreadDemo(String name) {super(name);} @Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"循环输出i="+i);}super.run();}}测试休眠方法:package thread; public class ThreadTest { public static void main(String[] args) {ThreadDemo thread=new ThreadDemo("线程A——>");thread.start();ThreadDemo thread1=new ThreadDemo("线程B——>");thread1.start();for (int i = 0; i < 10; i++) {try {Thread.sleep(1000);//当前线程休眠1000ms} catch (InterruptedException e) {System.out.println("捕获到的已常为:"+e.getMessage());}System.out.println(Thread.currentThread().getName()+"线程——>i="+i);}} }运行结果:线程A——>循环输出i=0线程A——>循环输出i=1线程A——>循环输出i=2线程A——>循环输出i=3线程A——>循环输出i=4线程A——>循环输出i=5线程A——>循环输出i=6线程A——>循环输出i=7线程A——>循环输出i=8线程A——>循环输出i=9main线程——>i=0main线程——>i=1main线程——>i=2main线程——>i=3main线程——>i=4main线程——>i=5main线程——>i=6main线程——>i=7main线程——>i=8main线程——>i=9当前线程运行所用时间:10s例3(以线程中的join方法为例):创建线程类:package thread; public class ThreadDemo extends Thread { public ThreadDemo() { } public ThreadDemo(String name) {super(name);} @Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println(Thread.currentThread().getName()+"循环输出i="+i);}super.run();}}测试join()方法类:package thread; public class ThreadModth {public static void main(String[] args){ThreadDemo thread=new ThreadDemo("线程一——>");thread.start();for (int i = 1; i < 20; i++) {if(i==10){try {thread.join();//当前线程休眠, 直到调用join方法的线程 执行完毕,当前线程开始执行} catch (InterruptedException e) {System.out.println("捕获到的异常为:"+e.getMessage());}}System.out.println(Thread.currentThread().getName()+"线程——>i="+i);}} }运行结果: main线程——>i=1main线程——>i=2线程一——>循环输出i=0main线程——>i=3线程一——>循环输出i=1main线程——>i=4线程一——>循环输出i=2main线程——>i=5线程一——>循环输出i=3main线程——>i=6线程一——>循环输出i=4main线程——>i=7线程一——>循环输出i=5main线程——>i=8线程一——>循环输出i=6main线程——>i=9线程一——>循环输出i=7线程一——>循环输出i=8线程一——>循环输出i=9线程一——>循环输出i=10线程一——>循环输出i=11线程一——>循环输出i=12线程一——>循环输出i=13线程一——>循环输出i=14线程一——>循环输出i=15线程一——>循环输出i=16线程一——>循环输出i=17线程一——>循环输出i=18线程一——>循环输出i=19main线程——>i=10main线程——>i=11main线程——>i=12main线程——>i=13main线程——>i=14main线程——>i=15main线程——>i=16main线程——>i=17main线程——>i=18main线程——>i=19二.线程的生命周期(状态转换)1.线程的状态2.要想实现多线程,必须在主线程中创建新的线程对象,任何线程都具有五种状态:创建,就绪,运行,阻塞,终止状态图:
3.线程的停止(1)如果线程的run()方法中执行的是一个重复执行的循环,可以提供一个标记来控制循环是否执行吧(2)如果线程因为执行sleep()方法或是wait()方法而进入了阻塞状态,此时想要停止它,可以使用interrupt(),程序会抛出InterruptException异常(3)如果程序因为输入输出的等待而阻塞,基本上 必须等待输入输出动作完成后才能离开阻塞状态,无法用interrupt() 方法来使线程离开run()方法,要想离开,只能通过引发一个异常例1.(停止循环线程)创建循环线程:package stopthread; public class LoopThread extends Thread{private boolean flag=true;//设置线程停止标志 public void setFlag(boolean flag) {this.flag = flag;} @Overridepublic void run() {while(flag){System.out.println("当前 线程正在运行....");}} }测试停止循环线程:package stopthread; public class StopLoop { public static void main(String[] args) {long startTime= System.currentTimeMillis();//开始线程时间LoopThread lt=new LoopThread();lt.start();try {Thread.sleep(3000);//当前线程休眠3000ms} catch (InterruptedException e) {System.out.println("捕获到的异常为:"+e.getMessage());}lt.setFlag(false);System.out.println("end............");long destTime=System.currentTimeMillis();//结束线程时间System.out.println("执行完线程共用时间:"+(destTime-startTime)/1000+"s"); } }运行结果:当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行....当前 线程正在运行..........................................end............执行完线程共用时间:3s例2.(以中断休眠为例 )创建休眠中断线程:package stopthread; public class InterruptThread extends Thread{private String name; public InterruptThread(String name) {super(name);this.name = name;} @Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"开始执行");System.out.println("准备休息5s");long startTime=System.currentTimeMillis();// 线程开始时间try {Thread.sleep(5000);} catch (InterruptedException e) {System.out.println("为什么要叫醒我?");} long destTime=System.currentTimeMillis();//线程完毕时间System.out.println(Thread.currentThread().getName()+"执行完毕");System.out.println("执行线程所用时间:"+(destTime-startTime)/1000+"s"); }}测试终端休眠:package stopthread; public class StopInterrupt { public static void main(String[] args) {InterruptThread it=new InterruptThread("线程一——>");it.start();try {Thread.sleep(2000);//当前线程休眠2000ms} catch (InterruptedException e) {e.printStackTrace();}it.interrupt();//打断这个线程,使之抛出InterruptedException异常} }运行结果:线程一——>开始执行准备休息5s为什么要叫醒我?线程一——>执行完毕执行线程所用时间:2s
相关文章推荐
- JAVA基础初探(十四)多线程(线程与进程概述、线程的实现、状态、常用方法、优先级、生命周期)
- Java并发1——线程创建、启动、生命周期与线程控制
- 【搞懂Java多线程之一】多线程相关概念,线程生命周期以及线程创建方法
- 在Java中,关于线程的创建,方法及生命周期
- Java基础:多线程(1)--线程的概述、创建线程的方式、线程的多种状态、线程常用的方法
- java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一)
- java 多线程总结(一) 创建线程的几种方法及对终止线程运行的讨论
- java中main方法启动的是一个进程还是一个线程
- Java多线程总结之---概念、创建/启动、状态变换
- java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器
- Java 对象锁-synchronized()与线程的状态与生命周期与守护进程
- 20180122: 线程的入门、进程与线程、线程的创建与启动、线程的生命周期
- Java多线程总结(2) — 线程生命周期中常用方法
- java基础学习总结——线程之使用Runnable接口创建线程的方法
- 线程与进程,线程的可用状态、创建、启动、停止、交互
- Java —— 多线程笔记 一、线程创建、启动、生命周期、线程控制
- day10 反射创建数组 线程的基本概念 线程的编写和启动方式 线程的运行状态以及状态转换方法 线程的调度和优先级设置
- Java线程生命周期各个状态总结
- 黑马程序员——Java基础---线程的另一个总结(1)--基本创建方法
- java 创建线程的方法总结