文档章节

学习笔记2:java中Thread类与线程的创建

牧羊人Berg
 牧羊人Berg
发布于 2015/10/15 23:07
字数 996
阅读 42
收藏 1

线程 是程序中的执行线程。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();  
  }  
}


© 著作权归作者所有

共有 人打赏支持
牧羊人Berg
粉丝 24
博文 96
码字总数 87512
作品 0
深圳
私信 提问
Java多线程(全)学习笔记(下)

七.Callable和Future接口 C#可以把任意方法包装成线程执行体,包括那些有返回值的方法。Java也从jdk1.5开始,加入了Callable接口用来扩展Runnable接口的功能,Callable接口提供一个call()...

明舞
2014/07/27
0
0
Java学习笔记---多线程

由于本人也处于学习java的阶段,文章错误之处还请指正,谢谢! 1.进程与线程的概念: 线程是进程内一个相对独立的基本调度单元。 线程是操作系统的基本调度单元。 进程在创建的时候必须同时创...

晨曦之光
2012/05/23
114
1
Java ThreadLocal 类的知识点解读

说起 Java 中的 ThreadLocal 类,可能很多安卓开发人员并不是很熟悉,毕竟很少有使用到的地方。但是如果你仔细分析过 Handler 源码的话,就一定见过这个类的出现。而 Handler 机制又是安卓知...

亦枫
2018/10/29
0
0
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1
JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题。(校对注:...

LCZ777
2014/05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

精读《论语》读后感作文3600字

精读《论语》读后感作文3600字: 学而篇第一:子曰:“学而时习之,不亦说乎?有朋友自远方来,不亦悦乎?人不知,而不愠,不亦君子乎? 朱熹解:即学而又时时习之,则学者熟,而衷心喜悦,其...

原创小博客
32分钟前
0
0
CPU内存结构

开局一张图 由于CPU频率太快了,为解决直接读取内存的数据上的延迟,在CPU和内存之间,存在3级缓存。 CPU在解决和缓存不一致上采用两种方式: 缓存一致性协议 总线锁机制 CPU CPU的一个时钟周...

春哥大魔王的博客
35分钟前
1
0
记一次centos 7内核升级事故

情景 公司做等保3测评,在进行系统漏洞检测时发现内核存在漏洞,需要进行升级。 名称 版本 升级前内核 CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core) 升级后内核 CentOS Linux (3.10.0-957...

阿dai
今天
8
0
PowerDesigner操作

1.去掉生成DDL里的注释 Database -> Edit Current DBMS -> Script -> Syntax -> BlockComment,去掉BlockComment里面的value内容。...

了凡川
今天
3
0
Django集成Markdown编辑器【附源码】

专注内容写作的你一定不要错过markdown 简单介绍 markdown是一种标记语言,通过简单的标记语法可以使普通的文本内容具有一定的格式,使用非常简单,学习成本极低 目前各大Blog平台都已支持m...

运维咖啡吧
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部