线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
进程(process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
一个进程至少拥有一个线程——主线程,也可以拥有多个线程;一个线程必须有一个父进程。多个进程可以并发执行;一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。
线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。
多线程就是几乎同时执行多个线程(一个处理器在某一个时间点上永远都只能是一个线程!即使这个处理器是多核的,除非有多个处理器才能实现多个线程同时运行。)。几乎同时是因为实际上多线程程序中的多个线程实际上是一个线程执行一会然后其他的线程再执行,并不是很多书籍所谓的同时执行。
创建一个新的执行线程有两种方法:
例如,计算大于规定值的素数的线程可以写成如下:
class PrimeThread extends Thread {long minPrime;PrimeThread(long minPrime) {this.minPrime = minPrime;}public void run() {// compute primes larger than minPrime. . .}
}
然后,以下代码将创建一个线程并启动它运行:
PrimeThread p = new PrimeThread(143);p.start();
此方法的同一个例子如下所示:
class PrimeRun implements Runnable {long minPrime;PrimeRun(long minPrime) {this.minPrime = minPrime;}public void run() {// compute primes larger than minPrime. . .}
}
然后,以下代码将创建一个线程并启动它运行:
PrimeRun p = new PrimeRun(143);new Thread(p).start();
通过下面的代码了解多线程:
package urrent;
/**** 线程了解--引入线程* @author 87366**/
public class Actor extends Thread {public void run() {System.out.println(getName() + "是一个演员!");int count = 0;boolean keepRunning = true;while (keepRunning) {System.out.println(getName() + "登台演出:" + (++count));if (count == 100) {keepRunning = false;} if (count %10 == 0) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}System.out.println(getName() + "的演出结束了!");}public static void main(String[] args) {Thread actor = new Actor();actor.setName("Mr.Thread");actor.start();Thread actressThread = new Thread(new Actress(),"Ms.Runnable");actressThread.start();}}class Actress implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "是一个演员!");int count = 0;boolean keepRunning = true;while (keepRunning) {System.out.println(Thread.currentThread().getName() + "登台演出:" + (++count));if (count == 100) {keepRunning = false;} if (count %10 == 0) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}System.out.println(Thread.currentThread().getName() + "的演出结束了!");}}
下面通过舞台剧《隋唐演义》的例子进行理解
下面是代码演示:
package urrent.base;import javax.swing.JInternalFrame;/*** 隋唐演义大戏舞台* @author 87366**/
public class Stage extends Thread {public void run() {System.out.println("欢迎观看隋唐演义");try {Thread.sleep(5000);} catch (InterruptedException e1) {e1.printStackTrace();}System.out.println("大幕徐徐拉开");try {Thread.sleep(5000);} catch (InterruptedException e1) {e1.printStackTrace();}System.out.println("话说隋朝末年,隋军与农民起义军杀得昏天黑地。。。");ArmyRunnable armyTsakOfDynasty = new ArmyRunnable();//隋朝军队ArmyRunnable armyTsakOfRevolt = new ArmyRunnable(); //农民起义军//使用Runnable接口创建线程Thread armyOfDynasty = new Thread(armyTsakOfDynasty,"隋朝军队");Thread armyOfRevolt = new Thread(armyTsakOfRevolt,"农民起义军");//启动线程,让双方开始作战armyOfDynasty.start();armyOfRevolt.start();//舞台线程休眠,大家专心观看军队的厮杀try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("正当双方激战正酣,半路杀出个程咬金");Thread mrCheng = new KeyPersonThread();mrCheng.setName("程咬金");System.out.println("程咬金的理想就是结束战争,使百姓安居乐业!");//停止军队作战//停止线程的方法armyTsakOfDynasty.keepRunning = false;armyTsakOfRevolt.keepRunning = false;try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}/*** 历史大戏留给关键人物*/mrCheng.start();try {mrCheng.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("战争结束,人民安居乐业,程先生实现了积极的人生梦想,为人民做出了贡献");System.out.println("谢谢大家的观看,再见!");}public static void main(String[] args) {new Stage().start();}}
package urrent.base;
/*** 军队进程 -- 模拟双方作战的行为* @author 87366**/
public class ArmyRunnable implements Runnable {//volatile保证了线程可以正确的读取其他线程写入的值//可见性 JMM , happens-before原则volatile boolean keepRunning = true;@Overridepublic void run() {while (keepRunning) {//发动五连击for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + "进攻对方[" + i + "]");//让出了处理器时间,下次该谁进攻还不一定呢!Thread.yield();}}System.out.println(Thread.currentThread().getName() + "结束了战斗!");}}
package urrent.base;public class KeyPersonThread extends Thread {public void run() {System.out.println(Thread.currentThread().getName() + "开始了战斗!");for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "突出重围,击杀隋军。。。");}System.out.println(Thread.currentThread().getName() + "结束了战斗!");}
}
我接触到的线程停止的方法有三种:
本文发布于:2024-01-30 21:14:29,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170662047222889.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |