`

jdk1.5——线程创建三种方式

 
阅读更多

 

线程 进程 多线程:
 



 

 

 

 

0 线程创建方法代码:

 

package thread;

/**
 * 线程须知: 线程的创建方式 thread.start(); 表示启动线程,并将这个线程添加到线程池中, 启动后分配到CPU时间片后,代码自动调用这个线程的run()方法
 * run()方法内执行的是线程体
 * 
 * Thread 主要看的源码:
 * public Thread(Runnable target) {
	init(null, target, "Thread-" + nextThreadNum(), 0);
    }
    
    
    public void run() {
	if (target != null) {
	    target.run();
	}
    }
 * @author zm
 *
 */
public class CreateThread {

	public static void main(String[] args) {
		
		// 创建方式1  继承父类 重写父类方法run(), 让线程执行子类重写后的线程体
		// 分支线程执行
		ChildThread childThread = new ChildThread();
		childThread.start();
		
		// 创建方式2, 面相对象思想,将线程体交给Thread,让Thread调用runnable的run()  干活的人我给你了,具体什么时候干让Thread来决定
		MyRunnable myRunnable = new MyRunnable();
		Thread child2Thread = new Thread(myRunnable);
		child2Thread.start();
		
		
		// 看如下案例, 分析结果:   结果是  thread : 线程名        案例重写了 run()方法因此不会再调用Thread.run() ,自然不会执行 runnable对象的run()
		new Thread(	new Runnable(){
			public void run() {
				while(true){
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("runnable :" + Thread.currentThread().getName());

				}							
			}
		}){
			public void run() {
				while(true){
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("thread :" + Thread.currentThread().getName());

				}	
			}
		}.start();
			
		
		// 主线程执行
		while(true) {
			try {
				Thread.sleep(700);
				System.out.println("main name is: " + Thread.currentThread().getName());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		
	}
	
	
	
	

}




class ChildThread extends Thread{

	@Override
	public void run() {
		while(true) {
			try {
				Thread.sleep(700);
				System.out.println("ChildThread name is: " + Thread.currentThread().getName());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}


class MyRunnable implements Runnable{

	@Override
	public void run() {
		while(true) {
			try {
				Thread.sleep(700);
				System.out.println("ChildThread1 name is: " + Thread.currentThread().getName());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
	
}

  

 

 

1 线程创建方法总结:

 

 1 线程两种创建方法下 执行线程都是用 thread.start(), 将thread交给cpu等待时间段
 2 线程启动,真正执行功能代码放在 run(){}中,
  看Thread的run()源代码写法:
      /**    明确说明了线程真正执行体执行内容
     * If this thread was constructed using a separate 
     * <code>Runnable</code> run object, then that 
     * <code>Runnable</code> object's <code>run</code> method is called;  如果传递runnable对象那么将执行runnable的run()方法
     * otherwise, this method does nothing and returns. 
     * <p>
     * Subclasses of <code>Thread</code> should override this method.  如果是Thread的话 那么需要重写此方法
     *
     * @see     #start()
     * @see     #stop()
     * @see     #Thread(ThreadGroup, Runnable, String)
     */
    public void run() {
	if (target != null) {
	    target.run();
	}
    }
 
 
   3 如果一个类,既集成了Thread并重写了run() 同时又给这个类传递了runnable对象,那么执行的是重写Thread的run()方法,因此run方法重写没有机会在执行到
   target != null target.run() 

 

2 脑图:
 


 

 3 线程创建方式3--> 通过Runnable子类FutureTask,得到线程执行结果:
   特点是 能够抛出异常 得到返回值
 
public static void main(String[] args) throws InterruptedException, ExecutionException {
		// TODO Auto-generated method stub
		FutureTask<String> ft = new FutureTask<String>(new Callable<String>() {

			@Override
			public String call() throws Exception {
				System.out.println("执行业务方法");
				return "ok";
			}
			
		});
		
		Thread thread3 = new Thread(ft);
		thread3.start();
		String result = ft.get();
		System.out.println("线程创建方式3,得到执行结果为: " +result);
	}
 
  • 大小: 40.6 KB
  • 大小: 14 KB
  • 大小: 14 KB
分享到:
评论

相关推荐

    jdk-1_5_0_01-windows-i586-p.rar

    首先,让我们关注JDK 1.5中的一个重要特性——自动装箱与拆箱。在之前的版本中,基本类型与包装类之间的转换需要手动进行,而JDK 1.5引入了自动装箱和拆箱机制,使得操作更加简便。例如,现在可以方便地将一个...

    JDK_API_1_6_zh_CN参考文档

    10. **泛型**:Java 1.5引入的泛型,允许在编译时检查类型安全,同时提供了一种方式来消除装箱和拆箱操作。 11. **枚举类型**:Java 1.5引入的枚举,是一种特殊的类,用于定义有限数量的常量。 12. **注解**:`@...

    beginning java

    《初识Java:JDK1.5入门精典》是一本专为新手设计的Java编程教程,基于Java Development Kit(JDK)1.5版本。这本书深入浅出地介绍了Java编程语言的基础概念和核心特性,旨在帮助读者快速掌握Java编程技能。 首先,...

    jdk_1.6.0_45

    在这个特定的版本——JDK 1.6.0_45,我们关注的是Java平台的标准版(Java SE)的一个早期版本。这个版本在2014年发布,包含了Java编译器、虚拟机(JVM)、类库以及开发者需要的各种工具,使得开发者能够在Windows...

    JDK-1-6中文API

    此资源——"JDK-1-6中文API",是Java程序员的重要参考资料,特别是对于初学者,它提供了一份详尽的中文文档,便于理解和应用Java的各种类库。 API(Application Programming Interface)是一系列预先定义的函数,...

    JDK_API_1.6.zip

    8. **枚举类型**:JDK 1.5引入的枚举类型,提供了一种更安全的替代常量的方式,可以避免误修改和类型安全问题。 9. **泛型**:泛型增强了代码的类型安全性,允许在类、接口和方法中指定类型参数,减少类型转换的...

    Java语言程序设计的课程设计项目——利用Java实现地球系动画完整实现实例(第2部分).pdf

    项目执行有两种方式:作为应用程序和Applet。在MyEclipse中,可以直接运行项目,观察程序的运行效果。如果打算长期在MyEclipse中工作,可以考虑为Application和Applet声明包,如com.px1987.animation。这样做的好处...

    阿里巴巴电话面试题目——Java

    1. **StringBuffer 实现方式与容量扩充**:StringBuffer 是线程安全的字符串操作类,它维护了一个字符数组来存储字符串。当内部数组容量不足时,会自动扩容。扩容策略通常是将容量翻倍。 2. **JVM 启动参数**:-...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    java学习进阶之路,如果从一个菜鸟进阶成大神(csdn)————程序.pdf

    - **JDK版本更新**:对比JDK1.5至JDK1.8的新特性,如自动装箱拆箱、枚举、泛型、并发工具类等改进。 通过系统学习以上知识点,并结合实际项目经验,你将逐渐积累深厚的技术底蕴,成为一名Java开发领域的专家。记住...

    双重检查锁

    - 为了提高多线程程序的可靠性和性能,JDK 1.5引入了一套新的内存模型。 - 新模型加强了对内存可见性的保证,增加了对volatile关键字的支持,并定义了更严格的同步操作规则。 #### 五、总结 双重检查锁机制在设计...

    java课后题答案(第一章)

    7. **多线程性**:Java内置了对多线程的支持,使得开发者可以轻松创建并发执行的程序,有效利用多核处理器的性能,同时避免了底层线程管理的复杂性。 8. **动态性**:Java具有动态绑定和动态加载类的能力,这意味着...

    设计模式-单例模式

    解决了懒汉式线程安全与效率问题,但在JDK1.5之前可能存在隐患,1.5之后已修复。 ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static ...

    Java笔记---李兴华

    - **发展期**:从JDK1.5至JDK1.7版本。这一阶段引入了许多新特性,如泛型、注解等,大大增强了Java的功能性和灵活性。 - **更名与升级**:1998年,Java2发布,标志着Java进入了一个新的发展阶段。随后,2005年Sun ...

    Java基础day01

    在接下来的几年里,Java不断进化,JDK1.3在2000年发布,随后是具有重大更新的Java SE 5.0(JDK1.5)在2004年推出,同时定义了Java EE(企业版)和Java ME(微型版)。 2009年,Sun Microsystems被Oracle公司收购,...

    JSP教程——必看.pdf

    - 早期的一种数据库连接方式,通过ODBC驱动连接数据库。 - **5.3 查询记录** - **5.3.1 顺序查询**:按照特定顺序检索数据。 - **5.3.2 游动查询**:使用ResultSet对象逐行检索数据。 - **5.3.3 随机查询**:...

    魔乐 JAVA 魔乐课堂实战系列

    最初计划使用C++进行开发,但由于C++过于复杂,Sun Microsystems的工程师决定基于C++创建一种新的编程语言平台——Oak(橡树)。然而,Oak在与NetScape的竞争中失利,但Sun并未放弃,反而转向浏览器技术的研究,并在...

    Android开发与应用——张荣,原书配套课件

    7.1.1 创建线程 7.1.2 操作线程 7.2 UI线程与非UI线程 7.3 多线程中的常用类 7.3.1 Handler类 7.3.2 AsyncTask类 7.3.3 Timer定时器 7.4 Android多线程通信机制 7.5 小结 练习 第8章 网络通信 ...

    java并发编程经典书籍(英文版)

    - **线程基础**:介绍了Java中的线程创建、控制和销毁,包括Thread类和Runnable接口。 - **同步机制**:详细讲解了synchronized关键字,wait/notify机制,以及如何使用这些机制实现线程间的通信和协作。 - **并发...

Global site tag (gtag.js) - Google Analytics