博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java创建线程的两种方式
阅读量:7232 次
发布时间:2019-06-29

本文共 3420 字,大约阅读时间需要 11 分钟。

方式

  • 继承Thread类
  • 实现Runnable方法

实例

#继承Thread类

public class ThreadTest2 extends Thread {    private int threadCnt = 10;    @Override    public void run() {        while (true) {            if (threadCnt > 0) {                System.out.println(Thread.currentThread().getName() + " 剩余个数 " + threadCnt);                threadCnt--;                try {                    Thread.sleep(30);                } catch (InterruptedException e) {                    e.printStackTrace();                }            } else {                break;            }        }    }    public static void main(String[] args) {        new ThreadTest2().start();        new ThreadTest2().start();    }}

执行

Thread-1 剩余个数 10Thread-0 剩余个数 10Thread-0 剩余个数 9Thread-1 剩余个数 9Thread-0 剩余个数 8Thread-1 剩余个数 8Thread-0 剩余个数 7Thread-1 剩余个数 7Thread-1 剩余个数 6Thread-0 剩余个数 6Thread-1 剩余个数 5Thread-0 剩余个数 5Thread-1 剩余个数 4Thread-0 剩余个数 4Thread-1 剩余个数 3Thread-0 剩余个数 3Thread-0 剩余个数 2Thread-1 剩余个数 2Thread-0 剩余个数 1Thread-1 剩余个数 1

 

#实现Runnable方法

public class RunnalbleTest2 implements Runnable {    private int threadCnt = 10;    @Override    public void run() {        while (true) {            if (threadCnt > 0) {                System.out.println(Thread.currentThread().getName() + " 剩余个数 " + threadCnt);                threadCnt--;                try {                    Thread.sleep(30);                } catch (InterruptedException e) {                    e.printStackTrace();                }            } else {                break;            }        }    }    public static void main(String[] args) {        RunnalbleTest2 runnalbleTest2 = new RunnalbleTest2();        new Thread(runnalbleTest2).start();        new Thread(runnalbleTest2).start();        new Thread(runnalbleTest2).start();        new Thread(runnalbleTest2).start();    }}

执行

Thread-0 剩余个数 10Thread-1 剩余个数 10Thread-2 剩余个数 8Thread-3 剩余个数 7Thread-1 剩余个数 6Thread-3 剩余个数 5Thread-2 剩余个数 6Thread-0 剩余个数 6Thread-1 剩余个数 2Thread-0 剩余个数 2Thread-2 剩余个数 2Thread-3 剩余个数 2

可以看出该实例中虽然是2个线程,但操作的threadCnt却是一个,实现了资源共享。

比较

实现接口的方式比继承类的方式更灵活,也能减少程序之间的耦合度,面向接口编程也是设计模式6大原则的核心

start()方法和run()方法区别

涉及到线程的几个状态

新建状态:使用 new 关键字和 Thread 类(或其子类)建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。

就绪状态:当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。

运行状态:如果就绪状态的线程获取到 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

 

区别

只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码。测试如下

package com.jihite.helloworld.thread;public class TestNoStart {    public static void main(String[] args) throws InterruptedException {        Thread t1 = new Thread() {            @Override            public void run() {                pong(1);                try {                    Thread.sleep(7000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        };        Thread t2 = new Thread() {            @Override            public void run() {                pong(2);                try {                    Thread.sleep(7000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        };        t1.start();        t2.start();//        t1.run();//        t2.run();        System.out.println("ping~~~~");    }    static void pong(int i) {        System.out.println("pong~" + i);    }}

参考

 

转载地址:http://uapfm.baihongyu.com/

你可能感兴趣的文章
变频器直流母线电路示意图(转载)
查看>>
atitit.跨语言执行cmd cli api的原理及兼容性设计草案
查看>>
第四章 类加载机制
查看>>
Windows 7下可以使用的各个命令语句+C#打开
查看>>
linux下停止tomcat
查看>>
IOS UI-控制器的创建和控制器的View的创建
查看>>
2014/4月金山WPS笔试
查看>>
android: ADB错误“more than one device and emulator”
查看>>
作为一个测试leader平时应该注意哪些方面
查看>>
字符和字符串
查看>>
Notice: Only variable references should be returned by reference(PHP版本兼容性问题)
查看>>
Windows 之 win10快捷键
查看>>
Entity Framework 并发处理
查看>>
使用Xamarin.Forms平台开发移动应用指南
查看>>
Oracle使用小记
查看>>
oracle去除字符串中间的空格
查看>>
【C语言入门教程】4.10 综合实例 - 媒体播放器
查看>>
剖析信用卡 DCC 交易
查看>>
javascript中的链表结构
查看>>
微信开发-ACCESS TOKEN 过期失效解决方案
查看>>