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