- 浏览: 495001 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (563)
- 工作经验 (12)
- 数据库 (13)
- Servlet (10)
- Struts2 (1)
- Spring (25)
- Eclipse (5)
- Hibernate (5)
- Eclips (8)
- HTTP (7)
- J2EE (21)
- EHcache (1)
- HTML (11)
- 工具插件使用 (20)
- JPA (2)
- 杂谈 (17)
- 数据结构与算法 (3)
- Cloud Foundry (1)
- 安全 (10)
- J2SE (57)
- SQL (9)
- DB2 (6)
- 操作系统 (2)
- 设计模式 (1)
- 版本代码管理工具 (13)
- 面试 (10)
- 代码规范 (3)
- Tomcat (12)
- Ajax (5)
- 异常总结 (11)
- REST (2)
- 云 (2)
- RMI (3)
- SOA (1)
- Oracle (12)
- Javascript (20)
- jquery (7)
- JSP自定义标签 (2)
- 电脑知识 (5)
- 浏览器 (3)
- 正则表达式 (3)
- 建站解决问题 (38)
- 数据库设计 (3)
- git (16)
- log4j (1)
- 每天100行代码 (1)
- socket (0)
- java设计模式 耿祥义著 (0)
- Maven (14)
- ibatis (7)
- bug整理 (2)
- 邮件服务器 (8)
- Linux (32)
- TCP/IP协议 (5)
- java多线程并发 (7)
- IO (1)
- 网页小工具 (2)
- Flash (2)
- 爬虫 (1)
- CSS (6)
- JSON (1)
- 触发器 (1)
- java并发 (12)
- ajaxfileupload (1)
- js验证 (1)
- discuz (2)
- Mysql (14)
- jvm (2)
- MyBatis (10)
- POI (1)
- 金融 (1)
- VMWare (0)
- Redis (4)
- 性能测试 (2)
- PostgreSQL (1)
- 分布式 (2)
- Easy UI (1)
- C (1)
- 加密 (6)
- Node.js (1)
- 事务 (2)
- zookeeper (3)
- Spring MVC (2)
- 动态代理 (3)
- 日志 (2)
- 微信公众号 (2)
- IDEA (1)
- 保存他人遇到的问题 (1)
- webservice (11)
- memcached (3)
- nginx (6)
- 抓包 (1)
- java规范 (1)
- dubbo (3)
- xwiki (1)
- quartz (2)
- 数字证书 (1)
- spi (1)
- 学习编程 (6)
- dom4j (1)
- 计算机系统知识 (2)
- JAVA系统知识 (1)
- rpcf (1)
- 单元测试 (2)
- php (1)
- 内存泄漏cpu100%outofmemery (5)
- zero_copy (2)
- mac (3)
- hive (3)
- 分享资料整理 (0)
- 计算机网络 (1)
- 编写操作系统 (1)
- springboot (1)
最新评论
-
masuweng:
亦论一次OutOfMemoryError的定位与解错 -
变脸小伙:
引用[color=red][/color]百度推广中运用的技术 ...
Spring 3 mvc中返回pdf,json,xml等不同的view -
Vanillva:
不同之处是什么??
Mybatis中的like查询 -
thrillerzw:
转了。做个有理想的程序员
有理想的程序员必须知道的15件事 -
liujunhui1988:
觉得很有概括力
15 个必须知道的 Java 面试问题(2年工作经验)
源:http://ifeve.com/creating-and-starting-java-threads/
评:
原文链接 译者:章筱虎 校对:方腾飞
Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程:
查看源代码打印帮助
1 Tread thread = new Thread();
执行该线程可以调用该线程的start()方法:
查看源代码打印帮助
1 thread.start();
在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了。
编写线程运行时执行的代码有两种方式:一种是创建Thread子类的一个实例并重写run方法,第二种是创建类的时候实现Runnable接口。接下来我们会具体讲解这两种方法:
创建Thread的子类
创建Thread子类的一个实例并重写run方法,run方法会在调用start()方法之后被执行。例子如下:
查看源代码打印帮助
1 public class MyThread extends Thread {
2 public void run(){
3 System.out.println("MyThread running");
4 }
5 }
可以用如下方式创建并运行上述Thread子类
查看源代码打印帮助
1 MyThread myThread = new MyThread();
2 myTread.start();
一旦线程启动后start方法就会立即返回,而不会等待到run方法执行完毕才返回。就好像run方法是在另外一个cpu上执行一样。当run方法执行后,将会打印出字符串MyThread running。
你也可以如下创建一个Thread的匿名子类:
查看源代码打印帮助
1 Thread thread = new Thread(){
2 public void run(){
3 System.out.println("Thread Running");
4 }
5 };
6 thread.start();
当新的线程的run方法执行以后,计算机将会打印出字符串”Thread Running”。
实现Runnable接口
第二种编写线程执行代码的方式是新建一个实现了java.lang.Runnable接口的类的实例,实例中的方法可以被线程调用。下面给出例子:
查看源代码打印帮助
1 public class MyRunnable implements Runnable {
2 public void run(){
3 System.out.println("MyRunnable running");
4 }
5 }
为了使线程能够执行run()方法,需要在Thread类的构造函数中传入 MyRunnable的实例对象。示例如下:
查看源代码打印帮助
1 Thread thread = new Thread(new MyRunnable());
2 thread.start();
当线程运行时,它将会调用实现了Runnable接口的run方法。上例中将会打印出”MyRunnable running”。
同样,也可以创建一个实现了Runnable接口的匿名类,如下所示:
查看源代码打印帮助
1 Runnable myRunnable = new Runnable(){
2 public void run(){
3 System.out.println("Runnable running");
4 }
5 }
6 Thread thread = new Thread(myRunnable);
7 thread.start();
创建子类还是实现Runnable接口?
对于这两种方式哪种好并没有一个确定的答案,它们都能满足要求。就我个人意见,我更倾向于实现Runnable接口这种方法。因为线程池可以有效的管理实现了Runnable接口的线程,如果线程池满了,新的线程就会排队等候执行,直到线程池空闲出来为止。而如果线程是通过实现Thread子类实现的,这将会复杂一些。
有时我们要同时融合实现Runnable接口和Thread子类两种方式。例如,实现了Thread子类的实例可以执行多个实现了Runnable接口的线程。一个典型的应用就是线程池。
常见错误:调用run()方法而非start()方法
创建并运行一个线程所犯的常见错误是调用线程的run()方法而非start()方法,如下所示:
查看源代码打印帮助
1 Thread newThread = new Thread(MyRunnable());
2 newThread.run(); //should be start();
起初你并不会感觉到有什么不妥,因为run()方法的确如你所愿的被调用了。但是,事实上,run()方法并非是由刚创建的新线程所执行的,而是被创建新线程的当前线程所执行了。也就是被执行上面两行代码的线程所执行的。想要让创建的新线程执行run()方法,必须调用新线程的start方法。
线程名
当创建一个线程的时候,可以给线程起一个名字。它有助于我们区分不同的线程。例如:如果有多个线程写入System.out,我们就能够通过线程名容易的找出是哪个线程正在输出。例子如下:
查看源代码打印帮助
1 MyRunnable runnable = new MyRunnable();
2 Thread thread = new Thread(runnable, "New Thread");
3 thread.start();
4 System.out.println(thread.getName());
需要注意的是,因为MyRunnable并非Thread的子类,所以MyRunnable类并没有getName()方法。可以通过以下方式得到当前线程的引用:
查看源代码打印帮助
1 Thread.currentThread();
因此,通过如下代码可以得到当前线程的名字:
查看源代码打印帮助
1 String threadName = Thread.currentThread().getName();
线程代码举例:
这里是一个小小的例子。首先输出执行main()方法线程名字。这个线程JVM分配的。然后开启10个线程,命名为1~10。每个线程输出自己的名字后就退出。
查看源代码打印帮助
01 public class ThreadExample {
02 public static void main(String[] args){
03 System.out.println(Thread.currentThread().getName());
04 for(int i=0; i<10; i++){
05 new Thread("" + i){
06 public void run(){
07 System.out.println("Thread: " + getName() + "running");
08 }
09 }.start();
10 }
11 }
12 }
需要注意的是,尽管启动线程的顺序是有序的,但是执行的顺序并非是有序的。也就是说,1号线程并不一定是第一个将自己名字输出到控制台的线程。这是因为线程是并行执行而非顺序的。Jvm和操作系统一起决定了线程的执行顺序,他和线程的启动顺序并非一定是一致的。
(全文完)
--------------------------------------------------------------------------------
原创文章转载请注明出处:如何创建并运行java线程
支持本站::Pay For Your Wish
评:
原文链接 译者:章筱虎 校对:方腾飞
Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程:
查看源代码打印帮助
1 Tread thread = new Thread();
执行该线程可以调用该线程的start()方法:
查看源代码打印帮助
1 thread.start();
在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了。
编写线程运行时执行的代码有两种方式:一种是创建Thread子类的一个实例并重写run方法,第二种是创建类的时候实现Runnable接口。接下来我们会具体讲解这两种方法:
创建Thread的子类
创建Thread子类的一个实例并重写run方法,run方法会在调用start()方法之后被执行。例子如下:
查看源代码打印帮助
1 public class MyThread extends Thread {
2 public void run(){
3 System.out.println("MyThread running");
4 }
5 }
可以用如下方式创建并运行上述Thread子类
查看源代码打印帮助
1 MyThread myThread = new MyThread();
2 myTread.start();
一旦线程启动后start方法就会立即返回,而不会等待到run方法执行完毕才返回。就好像run方法是在另外一个cpu上执行一样。当run方法执行后,将会打印出字符串MyThread running。
你也可以如下创建一个Thread的匿名子类:
查看源代码打印帮助
1 Thread thread = new Thread(){
2 public void run(){
3 System.out.println("Thread Running");
4 }
5 };
6 thread.start();
当新的线程的run方法执行以后,计算机将会打印出字符串”Thread Running”。
实现Runnable接口
第二种编写线程执行代码的方式是新建一个实现了java.lang.Runnable接口的类的实例,实例中的方法可以被线程调用。下面给出例子:
查看源代码打印帮助
1 public class MyRunnable implements Runnable {
2 public void run(){
3 System.out.println("MyRunnable running");
4 }
5 }
为了使线程能够执行run()方法,需要在Thread类的构造函数中传入 MyRunnable的实例对象。示例如下:
查看源代码打印帮助
1 Thread thread = new Thread(new MyRunnable());
2 thread.start();
当线程运行时,它将会调用实现了Runnable接口的run方法。上例中将会打印出”MyRunnable running”。
同样,也可以创建一个实现了Runnable接口的匿名类,如下所示:
查看源代码打印帮助
1 Runnable myRunnable = new Runnable(){
2 public void run(){
3 System.out.println("Runnable running");
4 }
5 }
6 Thread thread = new Thread(myRunnable);
7 thread.start();
创建子类还是实现Runnable接口?
对于这两种方式哪种好并没有一个确定的答案,它们都能满足要求。就我个人意见,我更倾向于实现Runnable接口这种方法。因为线程池可以有效的管理实现了Runnable接口的线程,如果线程池满了,新的线程就会排队等候执行,直到线程池空闲出来为止。而如果线程是通过实现Thread子类实现的,这将会复杂一些。
有时我们要同时融合实现Runnable接口和Thread子类两种方式。例如,实现了Thread子类的实例可以执行多个实现了Runnable接口的线程。一个典型的应用就是线程池。
常见错误:调用run()方法而非start()方法
创建并运行一个线程所犯的常见错误是调用线程的run()方法而非start()方法,如下所示:
查看源代码打印帮助
1 Thread newThread = new Thread(MyRunnable());
2 newThread.run(); //should be start();
起初你并不会感觉到有什么不妥,因为run()方法的确如你所愿的被调用了。但是,事实上,run()方法并非是由刚创建的新线程所执行的,而是被创建新线程的当前线程所执行了。也就是被执行上面两行代码的线程所执行的。想要让创建的新线程执行run()方法,必须调用新线程的start方法。
线程名
当创建一个线程的时候,可以给线程起一个名字。它有助于我们区分不同的线程。例如:如果有多个线程写入System.out,我们就能够通过线程名容易的找出是哪个线程正在输出。例子如下:
查看源代码打印帮助
1 MyRunnable runnable = new MyRunnable();
2 Thread thread = new Thread(runnable, "New Thread");
3 thread.start();
4 System.out.println(thread.getName());
需要注意的是,因为MyRunnable并非Thread的子类,所以MyRunnable类并没有getName()方法。可以通过以下方式得到当前线程的引用:
查看源代码打印帮助
1 Thread.currentThread();
因此,通过如下代码可以得到当前线程的名字:
查看源代码打印帮助
1 String threadName = Thread.currentThread().getName();
线程代码举例:
这里是一个小小的例子。首先输出执行main()方法线程名字。这个线程JVM分配的。然后开启10个线程,命名为1~10。每个线程输出自己的名字后就退出。
查看源代码打印帮助
01 public class ThreadExample {
02 public static void main(String[] args){
03 System.out.println(Thread.currentThread().getName());
04 for(int i=0; i<10; i++){
05 new Thread("" + i){
06 public void run(){
07 System.out.println("Thread: " + getName() + "running");
08 }
09 }.start();
10 }
11 }
12 }
需要注意的是,尽管启动线程的顺序是有序的,但是执行的顺序并非是有序的。也就是说,1号线程并不一定是第一个将自己名字输出到控制台的线程。这是因为线程是并行执行而非顺序的。Jvm和操作系统一起决定了线程的执行顺序,他和线程的启动顺序并非一定是一致的。
(全文完)
--------------------------------------------------------------------------------
原创文章转载请注明出处:如何创建并运行java线程
支持本站::Pay For Your Wish
发表评论
-
自旋锁、排队自旋锁、MCS锁、CLH锁
2016-02-19 17:08 478源:http://coderbee.net/index.php ... -
java.util.concurrent.locks.LockSupport
2014-12-28 19:56 587源:http://my.oschina.net/readjav ... -
Spring线程池开发实战
2014-12-12 10:44 463源:http://blog.csdn.net/chszs/ar ... -
自旋锁(Spin lock) 自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。 自
2014-11-05 10:36 591源:http://coderbee.net/index.php ... -
高并发无锁实现代码块只进入一次小技巧
2014-10-29 14:10 805源:http://kenwublog.com/conc ... -
Java偏向锁实现原理(Biased Locking)
2014-10-21 17:51 1255源:http://kenwublog.com/theory-o ... -
Java 6 JVM参数选项大全(中文版)
2014-10-21 17:51 613源:http://kenwublog.com/docs/jav ... -
Java轻量级锁原理详解(Lightweight Locking)
2014-10-21 17:50 641源:http://kenwublog.com/theo ... -
08.JAVA同步块
2014-01-09 21:03 0源:http://ifeve.com/synchronized ... -
07.线程安全及不可变性
2014-01-09 21:02 0源:07.线程安全及不可变性 评: 原文链接 作者:Jakob ... -
06.线程安全与共享资源
2014-01-09 21:02 0源:http://ifeve.com/thread-safet ... -
05.竞态条件与临界区
2014-01-09 21:01 0源:http://ifeve.com/race-conditi ... -
03.多线程的代价
2014-01-09 20:57 375源:http://ifeve.com/costs-of ... -
02.多线程的优点
2014-01-09 20:56 335源:http://ifeve.com/benefits/ 评: ... -
01.Java并发性和多线程介绍
2014-01-09 11:11 628源:http://ifeve.com/java-con ...
相关推荐
(2)、创建TestCounter类,在该类中定义main函数,在main函数中定义Storage对象、Counter对象和 Printer对象,创建Counter线程和Printer线程并启动 (3)、保存文件,调试并编译运行程序。 参考程序运行效果: 3. ...
Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类。 可以用如下方式用java中创建一个线程: Tread thread = new Thread(); 执行该线程可以调用该线程的start()方法: thread.start();...
自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...
推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 04.流程控制和数组(共33页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 05.面向对象(上)(共35页).ppt 推荐优质Java课程 疯狂Java语言...
推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 04.流程控制和数组(共33页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 05.面向对象(上)(共35页).ppt 推荐优质Java课程 疯狂Java语言...
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM...它可以在线程之间进行区分,以寻找相似之处,并具有“长运行线程”检测。如果记录了类的直方图,它还提供了线程转储中的堆对象的概述。
Java源码查看线程的运行状态.rarJava源码Java程序设计经典300例
推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 04.流程控制和数组(共33页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 05.面向对象(上)(共35页).ppt 推荐优质Java课程 疯狂Java语言...
如果一个程序中要实现两段程序代码同时交替运行,就需要产生多个线程,并指定每个线程上所要运行的程序代码段,这就是多线程。 程序启动运行时,就自动产生了一个线程,main方法就是在这个线程上运行的,当不再产生...
java线程分析工具(工具+使用说明) 1、生成堆栈报告1.txt ...在windows中双击运行:java线程堆栈分析工具-jca463.jar 3、拖入报告 导出1.txt到windows中,将1.txt拖入工具界面中的表格“Thread Dump List”
JAVA技巧(Java多线程运行时,减少内存占用量).pdf
堆(Heap-线程共享)-运行时数据区 ...................................................................................... 23 2.2.5. 方法区/永久代(线程共享) ..................................................
这个是spring 和 quartz的集成,quartz是单独的包,java线程的方式运行,利用自定义Jobfactory来解决spring注入service空指针的问题,简单实例执行main方法即可,很实用
推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 04.流程控制和数组(共33页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 05.面向对象(上)(共35页).ppt 推荐优质Java课程 疯狂Java语言...
这个是Java多线程示例,可以直接运行,希望对需要的人有所帮助!
比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 “同时”执行是人的感觉,在线程之间实际上轮换执行。 本文档提供Java多线程编程经验,方便广大Java爱好者研究学习...
主要内容 线程的概念 线程的生命周期 Java中多线程的编程 继承Thread类与使用Runnable接口 Thread类的主要方法 线程的同步与死锁 动画
1.得到服务器下载文件的大小,然后在本地设置一个临时文件和服务器端文件大小一致 a)获得访问网络地址 b)通过URL对象的openConnection()方法打开连接,返回一个连接...b)当没有正在运行的线程时切文件存在时删除文件
java多线程学习必备_快速理解java多线程(附代码、运行结果截图、解释文档)
Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个...