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

来源:互联网 发布:网络机顶盒收费吗 编辑:程序博客网 时间:2024/05/03 16:28

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

2.多线程带来的优点

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

3.创建线程的2种方式
3.1 继承Thread重写run方法创建线程

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

3.2 实现Runnable接口重写run方法创建线程

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

3.3 测试类运行查看两种创建线程方式输出结果

public class CreateThreadTest {    public static void main(String[] args) {        MyThread myThread = new MyThread();        myThread.start();        MyRunnable myRunnable = new MyRunnable();        Thread runnableThread = new Thread(myRunnable);        runnableThread.start();    }}输出结果:Thread-0:继承Thread类方式创建线程Thread-1:实现Runnable接口方式创建线程

4.项目中使用哪种创建线程方式更好?
查阅了一些资料后,发现大佬们对着两种创建线程方式哪种好并没有给出明确的答案。不过大佬们更倾向于实现Runnable接口方式,主要原因是:其一实现Runnable接口是更加符合面向对象思想,线程分为两部分,一是线程对象,二是线程任务,其二线程池可以有效的管理实现了Runnable接口的线程,如果线程池满了,新的线程就会排队等候执行,直到线程池空闲出来为止,而如果线程是通过实现Thread子类实现的,这将会复杂一些,其三Java语言为单继承多实现。

5.线程创建和执行顺序

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: 线程名0runningThread: 线程名2runningThread: 线程名1runningThread: 线程名3runningThread: 线程名4running

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

6.线程提高篇

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

以上代码是在是创建线程时,在构造中传入了Runnable实例,并且在内部重写了run方法,但是最后实际运行的是内部重写的run方法。

阅读全文
0 0