Java创建线程依赖java.lang.Thread类
package com.wkcto.chapter07.newthread;
/**
* 演示创建线程的方式一
* 定义Thread类的子类
* @author 蛙课网
*
*/
public class Test01 {
public static void main(String[] args) {
//3)创建线程对象
SubThread t1 = new SubThread();
//4) 开启线程
t1.start(); //开启的线程会执行run()方法
// t1.run(); //就是普通实例方法的调用, 不会开启新的线程
//当前线程是main线程
for( int i = 1; i<=100; i++){
System.out.println( "main : " + i);
}
/*
* 每次运行程序, 运行的结果可能不一样
* 运行程序后, 当前程序就有两个线程main线程和t1线程在同时执行, 这两个线程中哪个线程抢到CPU执行权, 这个线程就执行
*
* 在单核CPU中, 在某一时刻CPU只能执行一个任务, 因为CPU执行速度非常快, 可以在各个线程之间进行快速切换
* 对于用户来说, 感觉是多个线程在同时执行
*
*/
}
}
//1)定义类继承Thread
class SubThread extends Thread{
//2)重写run(), run()方法中的代码就是子线程要执行的代码
@Override
public void run() {
//在子线程中打印100行字符串
for( int i = 1; i<=100 ; i++){
System.out.println("sub thread -->" + i);
}
}
}
定义Runnable接口的实现类
package com.wkcto.chapter07.newthread;
/**
* 创建线程的方式二
* 实现Runnable接口
* @author 蛙课网
*
*/
public class Test02 {
public static void main(String[] args) {
//3) 创建线程对象, 调用构造方法 Thread(Runnable) , 在调用时, 传递Runnable接口的实现类对象
Prime p = new Prime(); //创建Runnable接口的实现类对象
Thread t2 = new Thread(p);
//4) 开启线程
t2.start();
//通过Runnable接口匿名内部类的形式创建线程
Thread t22 = new Thread(new Runnable() {
@Override
public void run() {
for( int i = 1; i <= 100; i++){
System.out.println("t22==> " + i);
}
}
});
t22.start();
// 当前线程是main线程
for (int i = 1; i <= 100; i++) {
System.out.println("main : " + i);
}
}
}
//1) 定义一个类实现Runnable接口
class Prime implements Runnable{
//2)重写run()方法, run()方法中的代码就是子线程要执行的代码
@Override
public void run() {
// 在子线程中打印100行字符串
for (int i = 1; i <= 100; i++) {
System.out.println("sub thread -->" + i);
}
}
}
定义Callable接口的实现类
package com.wkcto.chapter07.newthread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 创建线程的方式三
* 实现Callable接口
* @author 蛙课网
*
*/
public class Test03 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//3)创建线程对象
Prime2 p2 = new Prime2(); //创建Callable接口的实现类对象
FutureTask<Integer> task = new FutureTask<>( p2 ); //创建FutureTask对象
//FutureTask类实现了RunnableFuture接口, 该接口继承了Runnable接口, FutureTask类就是Runnable接口的实现类
Thread t3 = new Thread(task);
//4)开启线程
t3.start();
// 当前线程是main线程
for (int i = 1; i <= 100; i++) {
System.out.println("main : " + i);
}
//在main线程中可以取得子线程的返回值
System.out.println(" task result : " + task.get() );
}
}
//1)定义类实现Callable接口
//Callable接口的call()方法有返回值, 可以通过Callable接口泛型指定call()方法的返回值类型
class Prime2 implements Callable<Integer> {
//2)重写call()方法, call()方法中的代码就是子线程要执行的代码
@Override
public Integer call() throws Exception {
//累加1~100之间的整数和
int sum = 0 ;
for(int i = 1; i<=100; i++){
sum += i;
System.out.println("sum=" + sum);
}
return sum;
}
}