- 浏览: 1435355 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (363)
- oracle (43)
- 缓存策略 (4)
- 数据库设计 (7)
- IntelliJ IDEA (8)
- freemarker (3)
- JSP (12)
- java基础 (75)
- tomcat (14)
- 服务器 (10)
- maven (3)
- linux (21)
- e-learning (2)
- 手机开发 (1)
- 设计模式 (6)
- 技术之外 (2)
- 工具的使用 (8)
- HTML 5 (5)
- 网站前台 (38)
- 网站后台 (11)
- 项目管理 (12)
- 面试题 (5)
- 幽默 (0)
- 系统架构 (8)
- 创业 (10)
- div-css (5)
- 诗词歌赋 (1)
- 网络课堂组知识库 (4)
- 杂家 (3)
- android (12)
- 框架 (14)
- 读书笔记 (1)
- 孙子兵法 (1)
- mysql (3)
- 小人书 (0)
- Jquery (6)
- eclipse (2)
- 正则表达式 (1)
最新评论
-
a98709474:
写的很详细,看完了,明白了这种概念了
数据库水平切分(拆库拆表)的实现原理解析(转) -
a98709474:
MYSQL分库分表总结 -
CatchU:
7年前的招聘要求,厉害厉害
面试要求 -
luozhixiong:
<table class="bbcode&qu ...
MYSQL分库分表总结 -
沈寅麟:
好用
freemarker格式化
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。
1.继续Thread类
T.java
TestT.java
执行结果
主线程也有可能在子线程结束之前结束。并且子线程不受影响,不会因为主线程的结束而结束。
注意:
1:启动线程一定是 start()方法,而不是run()方法,如果写成run()方法启动
执行结果:
就全变成 顺序执行的了。这是不对的。
为什么我们不能直接调用run()方法呢?因为线程的运行需要本地操作系统的支持。 如果查看start的源代码的时候,会发现:
2:start方法重复调用的话,会出现java.lang.IllegalThreadStateException异常。
如写成这样:
执行结果:
可以看到程序抛出了异常,
这句话不会出现
2.实现Runnable接口
R.java
TestR.java
执行结果:
其实Thread也是实现Runnable接口的:
Thread和Runnable的区别:
1:实现Runnable接口的多线程程序要通过 类似下面方式启动
而继承Thread类的多线程程序,则可以直接调用start()方法启动:
2:Thread类中有一些方法,是Runnable接口中没有的,比如:
等
2:如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
执行结果
可以想象,如果这个是一个买票系统的话,如果count表示的是车票的数量的话,说明并没有实现资源的共享。
换为Runnable接口:
执行结果
总结一下:
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
所以建议大家劲量实现接口。
在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个jVM实习在就是在操作系统中启动了一个进程。
1.继续Thread类
T.java
/** * User: liuwentao * Date: 2011-5-5 18:36:31 * <p/> * 说明: */ public class T extends Thread { public T() { } public T(String threadName) { super(threadName); } public void run() { String threadName = super.getName(); System.out.println(threadName + " 线程运行开始!"); for (int i = 0; i < 5; i++) { double sleepTime = Math.random() * 10; System.out.println(i + " " + threadName + ",sleepTime=" + sleepTime); try { sleep((int)sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(threadName + " 线程运行结束!"); } }
TestT.java
/** * User: liuwentao * Date: 2011-5-5 18:37:01 * <p/> * 说明: */ public class TestT { /** * main方法其实也是一个线程 * @param rags */ public static void main(String[] rags) { Thread currentThread = Thread.currentThread(); String currentThreadName = currentThread.getName(); System.out.println("******" + currentThreadName + " 线程运行开始!"); T t1 = new T("Thread-A"); //如果我们没有指定名字的话,系统自动提供名字。如:Thread-0 T t2 = new T(); t1.start(); t2.start(); System.out.println("******" + currentThreadName + " 线程运行结束!"); } }
执行结果

主线程也有可能在子线程结束之前结束。并且子线程不受影响,不会因为主线程的结束而结束。
注意:
1:启动线程一定是 start()方法,而不是run()方法,如果写成run()方法启动
t1.run(); t2.run();
执行结果:

就全变成 顺序执行的了。这是不对的。
为什么我们不能直接调用run()方法呢?因为线程的运行需要本地操作系统的支持。 如果查看start的源代码的时候,会发现:
public synchronized void start() { if (threadStatus != 0 || this != me) throw new IllegalThreadStateException(); group.add(this); //这个方法有native关键字 start0(); if (stopBeforeStart) { stop0(throwableFromStop); } } /** * native关键字表示调用本地操作系统的函数。 * 因为多线程的实现需要本地操作系统的支持。 */ private native void start0();
2:start方法重复调用的话,会出现java.lang.IllegalThreadStateException异常。
如写成这样:
t1.start(); t2.start(); t1.start();
执行结果:

可以看到程序抛出了异常,
引用
******main 线程运行结束!
这句话不会出现
2.实现Runnable接口
R.java
/** * User: liuwentao * Date: 2011-5-5 18:36:31 * <p/> * 说明: */ public class R implements Runnable { private String name; public R() { } public R(String threadName) { this.name = threadName; } public void run() { System.out.println(name + " 线程运行开始!"); for (int i = 0; i < 5; i++) { int j = 0; while (j < 1000000) { j++; } System.out.println(i + " " + name); } System.out.println(name + " 线程运行结束!"); } }
TestR.java
/** * User: liuwentao * Date: 2011-5-5 18:37:01 * <p/> * 说明: */ public class TestR { public static void main(String[] rags) { System.out.println(Thread.currentThread().getName() + " 线程运行开始!"); R r1 = new R("A"); R r2 = new R("B"); Thread thread1 = new Thread(r1); thread1.start(); Thread thread2 = new Thread(r2); thread2.start(); System.out.println(Thread.currentThread().getName() + " 线程运行结束!"); } }
执行结果:

其实Thread也是实现Runnable接口的:

Thread和Runnable的区别:
1:实现Runnable接口的多线程程序要通过 类似下面方式启动
R r1 = new R("A"); Thread thread1 = new Thread(r1); thread1.start();
而继承Thread类的多线程程序,则可以直接调用start()方法启动:
T t1 = new T("Thread-A"); t1.start();
2:Thread类中有一些方法,是Runnable接口中没有的,比如:
引用
sleep
yield
stop
yield
stop
等
2:如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
/** * 继承Thread类,不能资源共享 * */ class hello extends Thread { private int count = 5; public void run() { for (int i = 0; i < 7; i++) { if (count > 0) { System.out.println("count= " + count--); } } } public static void main(String[] args) { hello h1 = new hello(); hello h2 = new hello(); hello h3 = new hello(); h1.start(); h2.start(); h3.start(); } }
执行结果
count= 5 count= 4 count= 3 count= 2 count= 1 count= 5 count= 4 count= 3 count= 2 count= 1 count= 5 count= 4 count= 3 count= 2 count= 1
可以想象,如果这个是一个买票系统的话,如果count表示的是车票的数量的话,说明并没有实现资源的共享。
换为Runnable接口:
/** * 实现Runnable接口,能资源共享 * */ class hello implements Runnable { private int count = 5; public void run() { for (int i = 0; i < 7; i++) { if (count > 0) { System.out.println("count= " + count--); } } } public static void main(String[] args) { hello he=new hello(); new Thread(he).start(); } }
执行结果
count= 5 count= 4 count= 3 count= 2 count= 1
总结一下:
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
所以建议大家劲量实现接口。
在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个jVM实习在就是在操作系统中启动了一个进程。
发表评论
-
打印IP 来源
2014-10-16 22:07 957<% String userAgent = reques ... -
java 写文本换行
2014-08-08 18:34 1996import org.apache.commons.io.Fi ... -
DBCP连接池配置示例
2014-06-17 11:44 1255<bean id="dataSourceOra ... -
CGLIB与asm
2014-05-05 14:42 1362“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言 ... -
201404转成 2014.04
2014-03-31 17:45 1011public static void main(Str ... -
取出 字符串中的 网址
2013-10-15 17:47 1274public static void main(Str ... -
java反国际化
2013-09-23 18:10 1030public static String fromEn ... -
AtomicInteger与Volatile修饰
2013-02-05 11:50 6061今天写代码,尝试使用了AtomicInteger这个类,感觉 ... -
ExecutorService线程池
2013-02-05 11:40 1632http://blog.sina.com.cn/s/blog ... -
web.xml中load-on-startup的作用
2012-12-24 10:06 1672如下一段配置,熟悉DWR的再熟悉不过了: <servle ... -
最新版本
2012-09-13 09:28 1022Java SE 7u7 apache-tomcat-7.0. ... -
格式化数字
2012-09-10 20:12 913public static void main(Str ... -
用apache common io包获得文件扩展名
2012-09-09 23:11 1381apache common io包包含了很多非常实用的工具类, ... -
值传递,引用传递
2012-07-28 23:29 1163java 对于 8种基本类型 和 他们的包装类型 , 外 ... -
代码之丑
2012-07-07 22:01 2446原文:http://www.infoq.com/cn/news ... -
Memcache
2012-06-27 09:36 1049Memcache是一个高性能的分布式的内存对象缓存系统,通过在 ... -
ActiveMQ
2012-06-14 15:09 15166ActiveMQ 是Apache出品,最流行的,能力强劲的开源 ... -
proxool配置
2012-06-12 11:43 1198项目结构 所需jar包 proxool.prope ... -
各种文件的注释
2012-04-23 10:44 1024<%-- comment --%> JSP注释,也称为“隐藏注 ... -
List排序
2012-03-27 20:18 1209集合类List存放的数据,默认是按照放入时的顺序存放的,比如依 ...
相关推荐
"大漠多线程模板"是一个专门针对C#开发的多线程处理框架,它为开发者提供了便捷的方式来管理和优化多线程应用。这个框架由知名开发者"大漠"创建,旨在简化复杂的并发编程,提高代码的可读性和可维护性。 多线程允许...
在IT行业中,多线程是一种常见的编程技术,它允许程序同时执行多个独立的任务,从而提高计算机系统的效率和响应性。特别是在自动化工具如“按键精灵”中,多线程的应用能够显著提升其性能和实用性。 标题“多线程_...
标题中的“pb9多线程控件”指的是在PowerBuilder 9.0(PB9)环境中,使用的一种能够实现真正多线程功能的组件或技术。PowerBuilder是一款经典的面向对象的开发工具,主要用于构建数据库应用系统。在PB的早期版本中,...
在编程领域,多线程是实现并发执行任务的重要机制,特别是在现代计算机系统中,多核处理器使得多线程成为提高程序性能的关键手段。C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多...
在IT领域,多线程编程是一项关键技能,尤其是在性能优化和并发处理方面。本文将深入探讨多线程编程的基础知识,以帮助初学者快速入门。 首先,我们需要理解什么是多线程。多线程是指在一个进程中同时执行多个独立的...
基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...
在编程领域,多线程是实现并发执行任务的重要机制,特别是在易语言中,它能有效提升程序的执行效率。易语言是一种中文编程语言,旨在降低编程门槛,让普通用户也能进行程序开发。本文将深入探讨易语言中的多线程以及...
在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程。本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。...
本文将详细探讨PB(包括PB9、PB12.5以及PB.NET)实现多线程的方法。 一、PB9的多线程实现 在PB9中,虽然官方并未直接支持多线程,但开发者可以通过使用Windows API函数来实现。一种常见的方式是创建一个新的窗口类...
在IT行业中,多线程是程序设计中的一个重要概念,尤其在Java编程中,它被广泛应用于提高应用程序的并发性能和响应速度。本压缩包“多线程基础与基于多线程的简单聊天室”提供了对多线程技术的实践理解和二次开发的...
"鱼刺多线程模块"是一个专为提升程序运行效率而设计的开源组件,它主要聚焦于多线程技术的应用。在计算机科学中,多线程是并发执行多个任务或子任务的一种方法,使得程序能够更高效地利用系统资源,特别是在多核...
在编程领域,尤其是在开发高效、响应迅速的应用程序时,多线程技术扮演着至关重要的角色。Qt5框架提供了一种方便的方式来实现多线程,它允许开发者在不同的线程中执行任务,从而避免主线程(GUI线程)因处理耗时操作...
Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...
Linux 下 C 语言多线程编程实例 Linux 下的多线程编程是一种非常重要的技术,在实际应用中有非常广泛的应用范围。多线程编程可以大大提高程序的执行效率和响应速度。但是,多线程编程也存在一些复杂性,例如线程...
单线程和多线程是计算机程序执行时的两种不同模型,它们在处理并发任务、资源管理和性能上有着显著的差异。理解这两种模型是编程尤其是服务器端开发的基础,尤其是在Java、C#等支持多线程的编程语言中。 首先,让...
在C#编程中,多线程技术常用于提高应用程序的执行效率,特别是在处理数据库操作时。SQLite是一款轻量级、嵌入式的关系型数据库,它广泛应用于桌面应用、移动设备和Web开发。当多线程环境对SQLite进行读写操作时,...
在Delphi编程中,多线程技术被广泛用于提高应用程序的执行效率,特别是在处理大量数据或执行长时间操作时。DLL(动态链接库)是Windows操作系统中的一个重要组件,它允许代码和资源在多个程序之间共享。当需要在多...
"鱼刺多线程注册源码例子"是一个基于"鱼刺多线程稳定框架"的编程实践,旨在展示如何在软件开发中有效地利用多线程技术来提高程序的执行效率和稳定性。在这个例子中,"鱼刺框架"可能是一个专门为多线程编程设计的开源...
Qt中利用OpenCV2.4.4多线程打开多摄像机 每个线程处理一个摄像机,从中拿出帧显示到主线程的Label控件上 模拟了一个16个摄像机的场景,有不开多线程和打开多线程的对比。 可以明显感觉到打开多线程后主界面不卡了。 ...
### 可并行递归算法的递归多线程实现:深入解析 #### 引言:多线程与并行处理的重要性 随着计算任务日益复杂,传统的单线程编程模型已无法满足高效处理大规模数据的需求。多线程编程作为一种提高程序并发性和性能...