博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习笔记2:java中Thread类与线程的创建
阅读量:6155 次
发布时间:2019-06-21

本文共 2633 字,大约阅读时间需要 8 分钟。

  hot3.png

线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。

每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。

当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:

  • 调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。

  • 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run 方法之外的异常。

创建新执行线程有两种方法:

1):    一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。

public class DemoThread1 {	/**	 * @author 牧羊的伯格女皇	 * @param args	 * date:2015-10-15	 */	public static void main(String[] args) {  //主线程负责执行main方法		SpeakDog dog = new SpeakDog();  // 创建线程		SpeakPig pig = new SpeakPig();  //创建线程		dog.start();  // 启动线程		pig.start();  // 启动线程 		for( int i=1;i<=10;i++){			System.out.print("羊 "+i+" ");		}	}}public class SpeakDog extends Thread { // Thread类的子类	@Override	public void run() {		for( int i=1; i<=5; i++){			System.out.print("狗 "+i+" ");		}	}}public class SpeakPig extends Thread {	@Override	public void run() {		for( int i=1;i<=7;i++){			System.out.print("猪 " + i +" ");		}	}	}//上述中JVM让 dog , pig , main 线程轮流使用cpu资源。//只有当程序中的所有线程结束了,JVM才结束java程序的执行。//不足: 上述程序在不同的而计算机运行或在同一台计算机反复运行的结果不尽相同,因为输出结果引来与当前CPU资源的使用情况。

2) 创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。

Thread(Runnable target)
分配新的Thread对象
public class DemoThread2 {	public static void main(String[] args) {		Thread speakdog;   //用Thread声明线程		Thread speakpig;   //用Thread声明线程		SpeakDog dog;   // dog 是目标对象		SpeakPig pig;   // pig是目标对象		dog = new SpeakDog();  //创建目标对象		pig = new SpeakPig();  // 创建目标对象		speakdog = new Thread(dog);  //创建线程 其目标对象是 dog		speakpig = new Thread(pig);   //创建线程 其目标对象是pig		speakdog.start();  //启动线程		speakpig.start();  //启动线程				for( int i=1; i<=10;i++){			System.out.print("羊 " + i +" ");		}	}}public class SpeakDog implements Runnable {	@Override	public void run() {		for( int i=1; i<=5; i++ ){			System.out.print("狗 "+ i + " ");		}	}}public class SpeakPig implements Runnable {	@Override	public void run() {		for( int i=1; i<=7; i++ ){			System.out.print("猪 "+ i + " ");		}	}}

线程间可以共享相同的内存单元(包括代码与数据) 并利用这些共享单元来实现数据交换,实时通信与必要的同步操作。

对于Thread(Runnable target)构造方法创建线程时,轮到它来想用CPU资源时,目标对象后就会自动调用接口中的run()方法,因此,对于使用同一目标对象的线程,目标对象的成员变量自然就是这些线程共享的数据单元。

另外,创建目标对象的类在必要时还可以是某个特定的子类,因此,使用Runnable接口比使用Thread的子类更具有灵活性。

public class MyThread extends OtherClass implements Runnable {    public void run() {     System.out.println("MyThread.run()");    }  }//当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:public void run() {    if (target != null) {     target.run();    }  }

转载于:https://my.oschina.net/gently/blog/517820

你可能感兴趣的文章
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
活在当下
查看>>
每天进步一点----- MediaPlayer
查看>>
PowerDesigner中CDM和PDM如何定义外键关系
查看>>
跨域-学习笔记
查看>>
the assignment of reading paper
查看>>
android apk 逆向中常用工具一览
查看>>
MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
查看>>
Skip List——跳表,一个高效的索引技术
查看>>
Yii2单元测试初探
查看>>
五、字典
查看>>
前端js之JavaScript
查看>>
Log4J日志配置详解
查看>>
实验7 BindService模拟通信
查看>>
scanf
查看>>
Socket编程注意接收缓冲区大小
查看>>
SpringMVC初写(五)拦截器
查看>>
检测oracle数据库坏块的方法
查看>>
SQL server 安装教程
查看>>