1. 直接使用Thread来创建

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();
}
} }

最新文章

  1. Shiro安全框架入门篇(登录验证实例详解与源码)
  2. 基于synchronized 或 ReadWriteLock实现 简单缓存机制
  3. 加速下载gradle
  4. [Android ] linux命令英文缩写的含义(方便记忆)
  5. yum 安装 phpmyadmin
  6. 【读书笔记】iOS-GCD-网络编程要不要使用GCD
  7. [转]如何:定义和处理 SOAP 标头
  8. Mybatis 学习-1
  9. Great writers inspire
  10. 解决android模拟器太大,小屏幕无法完全显示的问题
  11. style currentStyle getComputedStyle的区别和用法
  12. wpf的学习日志(一)
  13. Inno Setup for Windows service
  14. img标签和 background 属性的使用分析
  15. POJ--1056 IMMEDIATE DECODABILITY &amp;&amp; POJ--3630 Phone List(字典树)
  16. 高性价比 VPS virtwire Host
  17. 安装VMwareTool
  18. lxde 的安装和卸载以及注意事项,lubuntu
  19. 【word2vec】Distributed Representation——词向量
  20. Bzoj4710 分特产(容斥原理+组合数)

热门文章

  1. linux 查找最后几条数据
  2. 图像处理之opencv---mat、cvmat、IplImage之间的转换
  3. Android与WebView的插件管理机制
  4. 一致性Hash简单介绍和使用
  5. 对小程序的网络请求的封装 wx.request 接收参数修改
  6. SE14 调整并激活数据库
  7. ABAP调用新任务代码
  8. virtualBox 不能开启一个新任务的错误
  9. gradle中的 settings.gradle
  10. [zjoi]青蛙的约会_扩展欧几里德