matlab 超线程 java,java创建多线程的方式以及注意的点

本文详细介绍了Java中实现多线程的四种方式:继承Thread类、实现Runnable接口、匿名内部类以及使用Callable接口配合FutureTask。通过实例展示了每种方式的用法,并在最后讨论了线程资源共享的问题,强调了线程安全和正确创建线程的重要性。
摘要由CSDN通过智能技术生成

第一种方式 继承于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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值