java 创建线程_Java创建线程的两种方式
发布日期:2021-10-27 12:03:51 浏览次数:4 分类:技术文章

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

方式

继承Thread类

实现Runnable方法

实例

#继承Thread类

public class ThreadTest2 extendsThread {private int threadCnt = 10;

@Overridepublic voidrun() {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 voidmain(String[] args) {newThreadTest2().start();newThreadTest2().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 implementsRunnable {private int threadCnt = 10;

@Overridepublic voidrun() {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 voidmain(String[] args) {

RunnalbleTest2 runnalbleTest2= newRunnalbleTest2();newThread(runnalbleTest2).start();newThread(runnalbleTest2).start();newThread(runnalbleTest2).start();newThread(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(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

b08d310696042c8536abda4c256939c0.png

区别

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

packagecom.jihite.helloworld.thread;public classTestNoStart {public static void main(String[] args) throwsInterruptedException {

Thread t1= newThread() {

@Overridepublic voidrun() {

pong(1);try{

Thread.sleep(7000);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

};

Thread t2= newThread() {

@Overridepublic voidrun() {

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(inti) {

System.out.println("pong~" +i);

}

}

参考

转载地址:https://blog.csdn.net/weixin_34620658/article/details/114028128 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java 缩进_java编码规范_缩进和注释
下一篇:python 函数参数列表_Python 函数可变参数列表*args和**kwargs

发表评论

最新留言

很好
[***.229.124.182]2024年03月15日 05时51分12秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

程序中mysql添加用户_MySQL添加用户的两种方法 2019-04-21
简述mysql安装过程_mysql安装的过程 2019-04-21
后端接口重定向_不用再等后端的接口啦!这个开源项目花 2 分钟就能模拟出后端接口... 2019-04-21
学mysql需要英语水平多高_大学英语专业挂科率高吗 2019-04-21
mysql group by实现_SQL数据分析之 group by 的实现原理 2019-04-21
mysql数据库大小如何查看器_如何用SQL命令查看Mysql数据库大小 2019-04-21
python 红黑树_红黑树-Python实现 | 学步园 2019-04-21
java string 日期格式_JAVA中String.format的用法 格式化字符串,格式化数字,日期时间格式化,... 2019-04-21
php显示json,使用 PHP 获取并解析 JSON 显示在页面中 2019-04-21
js php排序表格,javascript实现对表格元素进行排序操作_javascript技巧 2019-04-21
php sspi,php 内置的 web 服务器 php -s 2019-04-21
java生成结果集向量,如何解释H2o深度学习输出向量? 2019-04-21
matlab 曲线拟合求导,如何对matlab cftool拟合得到的cfit函数求导数 2019-04-21
matlab 50hzquchu,新手求消除50HZ工频干扰陷波滤波器源程序 2019-04-21
laravel没有route.php,Laravel中的RouteCollection.php中的NotFoundHttpException 2019-04-21
php服务端开启socket,php socket服务端能不能在网页端开启?而不是只能用CLI模式开启... 2019-04-21
php不需要也能输出,php 如何只输出最后生成的那个值?? 2019-04-21
php正则过滤sql关键字,使用正则表达式屏蔽关键字的方法 2019-04-21
php取整v,php取整方式分享 2019-04-21
php写模糊搜索api接口,php通过sphinxapi接口实现全文搜索 2019-04-21