【Java】线程的创建和启动
2016-03-24 10:13
357 查看
一、继承Thread类创建线程类
定义Thread类的子类,并重写run()方法, 该run()方法为线程执行体。
创建Thread子类的实例,即创建子线程对象。
调用线程对象的start()方法启动该线程。
使用继承Thread类的方法来创建线程类时,多个线程之间无法共享线程类的实例变量。
二、实现Runnable接口创建线程类
定义Runnable接口的实现类,重写run()方法
创建Runnable实现类的实例,调用线程对象的start()方法。
三、使用Callable和Future创建线程。
线程的生命周期:new/Runnabe/Running/Blocked/Dead.
大多操作系统采用抢占式策略,系统会给每个可执行的线程一个小时间段来处理任务,当该时间段用完后,系统就会剥夺该线程所占用的资源。但一些小型设备如手机可能采用协作式调度策略,只有当一个线程调用了sleep()或yield()方法后才会放弃所占用的资源,也就是必须由该线程主动放弃所占资源。
不要对处于死亡状态的线程调用start()方法,会引发IllegalThreadStateException异常。
定义Thread类的子类,并重写run()方法, 该run()方法为线程执行体。
创建Thread子类的实例,即创建子线程对象。
调用线程对象的start()方法启动该线程。
public class FirstThread extends Thread{ /** * @param args */ private int i; public void run(){ for(;i < 100; i++) { System.out.println(getName()+" "+ i); } } public static void main(String[] args) { // TODO Auto-generated method stub for(int i = 0; i <100; i++) { System.out.println(Thread.currentThread().getName()+" "+i); if(i==20) { new FirstThread().start(); new FirstThread().start(); } } } }主线程的执行体是main()方法。
使用继承Thread类的方法来创建线程类时,多个线程之间无法共享线程类的实例变量。
二、实现Runnable接口创建线程类
定义Runnable接口的实现类,重写run()方法
创建Runnable实现类的实例,调用线程对象的start()方法。
public class FirstThread implements Runnable{ private int i; public void run() { for(;i < 100; i++) { System.out.println(Thread.currentThread().getName()+" "+ i); } } public static void main(String[] args) { for(int i = 0; i <100; i++) { System.out.println(Thread.currentThread().getName()+" "+i); if(i==20) { FirstThread ft = new FirstThread(); new Thread(ft,"线程1").start(); new Thread(ft,"线程2").start(); } } } }采用Runnable接口的方式创建多个线程可以共享线程类的实例变量。
三、使用Callable和Future创建线程。
线程的生命周期:new/Runnabe/Running/Blocked/Dead.
大多操作系统采用抢占式策略,系统会给每个可执行的线程一个小时间段来处理任务,当该时间段用完后,系统就会剥夺该线程所占用的资源。但一些小型设备如手机可能采用协作式调度策略,只有当一个线程调用了sleep()或yield()方法后才会放弃所占用的资源,也就是必须由该线程主动放弃所占资源。
不要对处于死亡状态的线程调用start()方法,会引发IllegalThreadStateException异常。
相关文章推荐
- 正则表达式(参考java编程思想)
- Java之类的封装,继承,多态
- Specified VM install not found: type Standard VM, name jdk1.6.0_05
- Spring Batch学习
- 请问在JAVA中Map和HashMap有什么区别?
- Java NIO 和 IO 的区别详解
- Java类加载器总结
- Spring和MyBatis环境整合
- Scala学习5之scala与java的不同之总结1
- 在eclipse中使用java访问presto
- Spring mvc 学习的笔记
- Java内存模型FAQ(十)volatile是干什么用的
- Mac OS 您需要安装旧 Java SE 6 运行环境才能打开“XXX” 问题
- java 集合类
- springmvc mybatis fileupload实现文件断点续传
- java 定义一个类型安全的Map
- java 带包路径,编译和运行相关
- JAVA 内存模型
- java如何从List中取值
- java 声明静态Map常量的一种简单方式