java创建线程的两种,Java创建多线程的两种方式对比

采用继承Thead类实现多线程:

优势:编写简单,如果需要访问当前线程,只需使用this即可,无需使用Thead.currentThread()方法。

劣势:因为这种线程类已经继承了Thead类,所以不能再继承其它类。

示例代码:

package org.frzh.thread;

public class FirstThread extends Thread{

private int i;

//重写run方法,run方法的方法体就是线程执行体

public void run() {

for (; i < 100; i++) {

//当线程类继承Thread类时,可以直接调用getName方法获得当前线程名

//如果想获得当前线程,直接使用this

//Thread对象的getName方法返回当前线程的名字

System.out.println(getName() + " " + i);

}

}

public static void main(String[] args) {

for (int i = 0; i < 100; i++) {

//调用Thead的currentThread方法获取当前线程

System.out.println(Thread.currentThread().getName() + " " +i);

if (i == 20) {

new FirstThread().start();

new FirstThread().start();

}

}

}

}

运行结果片段:

8a65f95c8b8260f973bc35fab074ef9a.png

我们发现,在两个子线程中i的值并不连续,似乎与我们说的子线程直接共享数据不符。其实,在这里我们实例化了两个子线程,每个拥有自己的实例变量i。

采用实现Runable接口的多线程:

优势:线程类只是实现了Runable接口,因此还可以继承其他类;

在这种情况下,可以使多个线程共享一个target对象,所以非常适合多个线程用来处理同一份资源的情况,从而可以将cpu、代码和数据分开,形成清晰的模型,较好的体现面向对象思想。

劣势:编程略有些复杂,如果要访问当前线程必须使用Thread.currentThread方法。

示例代码:

package org.frzh.thread;

public class SecondThread implements Runnable{

private int i;

@Override

public void run() {

// TODO Auto-generated method stub

for (; i < 100; i++) {

System.out.println(Thread.currentThread().getName() + " " + i);

}

}

public static void main(String[] args) {

for (int i = 0; i < 100; i++) {

System.out.println(Thread.currentThread().getName() + " " + i);

if (i == 20) {

SecondThread st = new SecondThread();

new Thread(st, "子线程1").start();

new Thread(st, "子线程2").start();

}

}

}

}

运行结果片段:

3bbf669b7275c3e31e623a0f98ee2f94.png

可以看到,此时的i值是连续变化的,因为线程1和2共享同一个target。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值