Java面向对象
Java异常
Java数组
Java常用类
Java集合
Java IO流
Java线程
Java反射
Socket编程
Java注解开发
Java GoF设计模式
HashMap
Java内存模型
Java线性表

Java创建线程的方式

Java创建线程依赖java.lang.Thread类

定义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;
	}
	
}