第一种方式 继承于Thread类
public class MyThread extends Thread {
@Override
public void run() {
//执行的方法,实现所需的功能
int i=10;
do {
System.out.println("线程启动");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}while (i<4);
}
}
测试
public class Main {
public static void main(String[] args) {
//第一种方式
new MyThread().start();//创建并启动
}
}
第二种方式 实现Runnable接口
public class MyThread2 implements Runnable {
@Override
public void run() {
int arr[] = {1,2,3};
//增强for
for(int i : arr){
System.out.println("数值为=="+i);
}
}
}
测试
public class Main {
public static void main(String[] args) {
//第二种方式
MyThread2 myThread2 = new MyThread2();
Thread thread=new Thread(myThread2);
thread.start();
}
}
第三种方式 通过匿名内部类的方式创建
public class MyThread3 {
//使用匿名内部类的方式创建
public static void main(String[] args) {
//第一种方式 继承Thread类 重写run方法
// new Thread(){
// @Override
// public void run() {
//
// for (int i = 0; i<5 ;i++){
// System.out.println("i的数值是==="+i);
// }
//
// }
// }.start();
//第二种方式 实现runnbale接口
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i<5; i++){
System.out.println("i的数值是=="+i);
}
}
}).start();
}
}
第四种方式 使用Callable接口实现类并实现call方法
public class Demo {
public static void main(String[] args) throws Exception {
//创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例
Callable call = new Callable() {
@Override
public Integer call() throws Exception {
System.out.println("计算1+......100的和");
int sum =0;
for (int i=1;i<=100;i++){
sum+=i;
}
Thread.sleep(1000);
System.out.println("----结果是----");
return sum;
}
};
//使用FutureTask类来包装Callable对象
FutureTask task = new FutureTask<>(call);
Thread thread = new Thread(task);
//启动线程
thread.start();
System.out.println("拿到的结果是==="+task.get());
}
}
注意的点 创建两个线程
public class MyThread4 extends Thread{
private int ticket = 5;
@Override
public void run() {
while (true){
if (ticket>0){
System.out.println("当前执行的线程名称是: "+Thread.currentThread().getName()+" 出票数是:"+ticket--);
}else {
System.exit(0);
}
}
}
}
测试方式一:
public static void main(String[] args){
//报出异常,是因为同一个Thread不能重复调用start方法
//并且执行的结果来看只运行了一个线程,说明每创建一个Thread对象,只能够创建一个线程
/*
Exception in thread "main" java.lang.IllegalThreadStateException
当前执行的线程名称是: Thread-0 出票数是:5
当前执行的线程名称是: Thread-0 出票数是:4
当前执行的线程名称是: Thread-0 出票数是:3
当前执行的线程名称是: Thread-0 出票数是:2
当前执行的线程名称是: Thread-0 出票数是:1
*/
Thread t1= new MyThread4();
t1.start();
t1.start();
}
测试方式二
public static void main(String[] args){
//从执行的结果来看,创建了两个线程对象,各自执行自己的互不影响
/*
当前执行的线程名称是: Thread-0 出票数是:5
当前执行的线程名称是: Thread-0 出票数是:4
当前执行的线程名称是: Thread-0 出票数是:3
当前执行的线程名称是: Thread-0 出票数是:2
当前执行的线程名称是: Thread-0 出票数是:1
当前执行的线程名称是: Thread-1 出票数是:5
当前执行的线程名称是: Thread-1 出票数是:4
当前执行的线程名称是: Thread-1 出票数是:3
当前执行的线程名称是: Thread-1 出票数是:2
当前执行的线程名称是: Thread-1 出票数是:1
*/
new MyThread4().start();
new MyThread4().start();
}
测试方式三
public static void main(String[] args){
//启动四个线程,并实现资源共享的目的
/*
当前执行的线程名称是: Thread-1 出票数是:5
当前执行的线程名称是: Thread-2 出票数是:4
当前执行的线程名称是: Thread-1 出票数是:3
当前执行的线程名称是: Thread-3 出票数是:1
当前执行的线程名称是: Thread-2 出票数是:2
*/
MyThread4 t = new MyThread4();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}