您的位置:首页 > 编程语言 > Java开发

(一) Java多线程详解之创建线程的两种方式

2017-05-17 10:27 711 查看

多线程

在过去单CPU时代单任务在一个时间点只能执行单一程序,之后发展到多任务阶段计算机能在同一时间点并行执行多任务或多进程,虽然并不是真正意义上的”同一时间点”而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间及所有的内存和其他计算机资源,一个好的程序榜样是在其不再使用这些资源时对其进行释放以使得其他程序能有机会使用这些资源,再后来发展到多线程技术使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序,当一个程序运行在多线程下就好像有多个CPU在同时执行该程序。然而在现代的计算机伴随着多核CPU的出现,也就意味着不同的线程能被不同的CPU核得到真正意义的并行执行

多线程带来了如下几个优点

1.程序响应更快
2.资源利用率更好
3.程序设计在某些情况下更简单


线程的创建与启动

继承Thread类重写run方法

public class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ":继承Thread类方式创建线程");
}

public static void main(String[] args) {
Thread thread = new MyThread();
thread.start();
}
}


实现Runnable接口重写run方法

public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ":实现Runnable接口方式创建线程");
}

public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}


以上两种方式都可以创建线程且最终效果相同,不过大部分人更倾向于使用实现Runnable接口方式,主要原因是:其一实现Runnable接口是更加符合面向对象思想,线程分为两部分一是线程对象二是线程任务;其二线程池可以有效的管理实现了Runnable接口的线程,如果线程池满了新的线程就会排队等候执行直到线程池空闲出来为止,而如果线程是通过实现Thread子类实现的这将会复杂一些;其三Java语言为单继承多实现

线程提高篇

线程创建和执行顺序

public class ThreadExample {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread("线程名" + i) {
public void run() {
System.out.println("Thread: " + getName() + "running");
}
}.start();
}
}
}

测试结果:
Thread: 线程名0running
Thread: 线程名2running
Thread: 线程名1running
Thread: 线程名3running
Thread: 线程名4running


尽管启动线程的顺序是有序的但是执行的顺序并非是有序的,线程执行顺序是由JVM和操作系统一起决定的

线程内部执行流程分析

public class ThreadExample2 {
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("runnable :" + Thread.currentThread().getName());
}
}) {
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread :" + Thread.currentThread().getName());
}
}.start();
}
}


运行以上代码输出结果为:thread :Thread-0

因为线程的start方法最终是调用Thread的run方法,代码如下

public void run() {
if (target != null) {
target.run();
}
}


从代码上可以看出如果target对象不为空则运行target对象的run方法(target为通过new Thread(Runnable target)构造传入的Runnable对象),但是此处Thread的run方法已经被重写,所以不会再执行Runnable实例中的run方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息