Java的多线程创建方法
2016-05-09 08:16
471 查看
1. 直接使用Thread来创建
2. 通过实现Runnable接口,并将Runnable实现对象作为Thread的Target的方式创建
注:区别于第一种方法,这里可以达到两个线程共享变量i的目的。
3. 通过实现Callable接口的方式创建(这是一个具有返回值的创建方式)
注:FutureTask只能启动一个线程
package com.test.tt; public class ThreadEx extends Thread{ private int j; public void run(){ for(j=0; j<100;j++){ System.out.println("当前的线程名称是:"+ getName() + " " + "当前j的值是:" + j); } } public static void main(String[] args) { for(int h=0; h<100;h++){ if(h==20){ //这里新建了两个Thread对象 ThreadEx threadTest1= new ThreadEx(); ThreadEx threadTest2= new ThreadEx(); threadTest1.start(); threadTest2.start(); } System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前h的值是:" + h); } } }
2. 通过实现Runnable接口,并将Runnable实现对象作为Thread的Target的方式创建
注:区别于第一种方法,这里可以达到两个线程共享变量i的目的。
package com.test.tt; public class RunnableEx implements Runnable{ private int i; @Override public void run() { for(i=0; i<100;i++){ System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前i的值是:" + i); } } public static void main(String[] args) { for(int j=0;j<100;j++){ System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前j的值是:" + j); if(j==20){ RunnableEx REx=new RunnableEx(); //这里也新建了两个Thread对象,但是里面的Target是同一个Runnable实现类对象 Thread thread1 = new Thread(REx, "实例1"); Thread thread2 = new Thread(REx, "实例2"); thread1.start(); thread2.start(); } } } }
3. 通过实现Callable接口的方式创建(这是一个具有返回值的创建方式)
注:FutureTask只能启动一个线程
package com.test.tt; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class CallableEx implements Callable{ @Override public Object call() throws Exception { int i =0; for(;i<1000;i++){ System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前i的值是:" + i); } return i; } public static void main(String[] args) { // TODO Auto-generated method stub CallableEx CEx = new CallableEx(); FutureTask<Integer> task = new FutureTask<Integer>(CEx); for(int j=0;j<1000;j++){ System.out.println("当前的线程名称是:"+ Thread.currentThread().getName() + " " + "当前i的值是:" + j); if(j==200){ Thread thread1 = new Thread(task, "实例1"); thread1.start(); } } try{ //这里的get()方法可以获取到子线程的返回值,而且在执行时会中断main线程 System.out.println("线程的返回值:" + task.get()); }catch(Exception ex){ ex.printStackTrace(); } } }
相关文章推荐
- Java数据类型的分类
- Java设计模式(八) 适配器模式
- Java ArrayList源码剖析
- java的类加载顺序
- JAVA笔记之IO流
- 反射和注解的使用
- Eclipse中,如何把一个java项目变成web项目?
- (七)Struts2 验证框架
- 使用Android Studio打开eclipse项目以及打开网上下载的studio项目报错解决办法
- java中的一些基本语句
- (六)Struts2 国际化
- 012 Integer to Roman(Java)
- 【转】Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- spring 、zookeeper(dubbo)整合
- JAVA代码训练营救——TreeSet的泛型实现
- java.lang.NoClassDefFoundError: org/jaxen/JaxenException
- windows系统下Eclipse启动界面更改
- Java Web基础小结之Jsp JavaBean
- Java NIO 理解
- Spring的Controller请求方法中参数名匹配,但是参数类型不同会报404