Java并发编程:线程的创建
Java并发编程:线程的创建
*/-->
code {color: #FF0000}
pre.src {background-color: #002b36; color: #839496;}
Java并发编程:线程的创建
Table of Contents
在Java中线程的创建主要有两种,一种是通过继承抽象类Thread,一种是通过实现Runnable接口。当然,还有Concurent包里面的Callable和Future也可以算是一种。
1 Thread
我们先来看一下,使用Thread如何创建线程:
- public class ThreadDemo extends Thread {
- @Override
- public void run() {
- System.out.println("Current thread name is: " + Thread.currentThread().getName());
- }
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- Thread thread = new ThreadDemo();
- thread.start();
- }
- }
- }
- Current thread name is: Thread-0
- Current thread name is: Thread-2
- Current thread name is: Thread-1
- Current thread name is: Thread-3
- Current thread name is: Thread-5
- Current thread name is: Thread-4
- Current thread name is: Thread-6
- Current thread name is: Thread-7
- Current thread name is: Thread-8
- Current thread name is: Thread-9
可以看到,我们创建来10个线程,但是执行的顺序是不确定的。可以设置优先级,默认是5,最大是10,最小是1.但是即使设置来优先级,顺序也是不能保证。
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- Thread thread = new ThreadDemo();
- thread.setPriority(i + 1);
- thread.start();
- }
- }
优先级逐渐上升,但执行但结果还是一样。
2 Runnable
我们再来使用Runnable创建线程:
- public class RunnableDemo implements Runnable {
- @Override
- public void run() {
- System.out.println("Current runnable thread name is: " + Thread.currentThread().getName());
- }
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- Thread thread = new Thread(new RunnableDemo());
- thread.start();
- }
- }
- }
- Current runnable thread name is: Thread-0
- Current runnable thread name is: Thread-3
- Current runnable thread name is: Thread-2
- Current runnable thread name is: Thread-5
- Current runnable thread name is: Thread-1
- Current runnable thread name is: Thread-6
- Current runnable thread name is: Thread-7
- Current runnable thread name is: Thread-4
- Current runnable thread name is: Thread-8
- Current runnable thread name is: Thread-9
可以看出,实现Runnable接口接口之后但RunnableDemo类但实例还是无法直接运行的,它必须将实例对象传入Thread类,然后,才能调用Thread对象中的start()进行启动。
3 start() 和 run()
我们接下来来看一下start() 和 run()的区别:
当我们中定义新的线程类的时候,唯一覆写的方法就是run()。那么,我们能不能直接调用run()方法呢?
答案是肯定的。
我们将start()替换为run()再试一下:
- public static void main(String[] args) {
- for (int i = 0; i < 10; i++) {
- Thread thread = new Thread(new RunnableDemo());
- thread.run();
- }
- }
- Current runnable thread name is: main
- Current runnable thread name is: main
- Current runnable thread name is: main
- Current runnable thread name is: main
- Current runnable thread name is: main
- Current runnable thread name is: main
- Current runnable thread name is: main
- Current runnable thread name is: main
- Current runnable thread name is: main
- Current runnable thread name is: main
结果全是主线程在运行,也就是说根据就没有新的线程启动运行。所以,使用run()方法调用时,就和一般的函数调用一样,是由当前线程进行调用的,并不会启动新的线程,然后在新的线程中运行这个run()方法。只有使用start()方法去调用,才会启动新的线程,然后,在新的线程中运行run()方法。
Date: 2017-07-04 21:37
Author: WEN YANG
Created: 2017-07-04 Tue 22:44
Java并发编程:线程的创建的更多相关文章
- Java并发编程:如何创建线程?
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...
- Java并发编程:线程和进程的创建(转)
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...
- 【转】Java并发编程:如何创建线程?
一.Java中关于应用程序和进程相关的概念 在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认是java.exe或者javaw.exe(windows下可以通过 ...
- 2、Java并发编程:如何创建线程
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...
- Java 并发编程 | 线程池详解
原文: https://chenmingyu.top/concurrent-threadpool/ 线程池 线程池用来处理异步任务或者并发执行的任务 优点: 重复利用已创建的线程,减少创建和销毁线程造 ...
- java并发编程 线程基础
java并发编程 线程基础 1. java中的多线程 java是天生多线程的,可以通过启动一个main方法,查看main方法启动的同时有多少线程同时启动 public class OnlyMain { ...
- java并发编程 | 线程详解
个人网站:https://chenmingyu.top/concurrent-thread/ 进程与线程 进程:操作系统在运行一个程序的时候就会为其创建一个进程(比如一个java程序),进程是资源分配 ...
- Java并发编程:线程间通信wait、notify
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Java并发编程——线程的基本概念和创建
一.线程的基本概念: 1.什么是进程.什么是是线程.多线程? 进程:一个正在运行的程序(程序进入内存运行就变成了一个进程).比如QQ程序就是一个进程. 线程:线程是进程中的一个执行单元,负责当前进程中 ...
- Java并发编程——线程池的使用
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
随机推荐
- 解决javax.servlet.jsp.JspException cannot be resolved to a type
转自:https://blog.csdn.net/fengspg/article/details/41645159
- ASE Code Search
重现基线模型 Hamel's model 基线模型原理 如何实现semantic search?在已有数据库的基础上,衡量一个句子和每段代码的相关性再进行排序,选出最优代码片段即可实现一个通用的cod ...
- Lamabda Where Select Find First等区别
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- Linux性能优化从入门到实战:10 内存篇:如何利用Buffer和Cache优化程序的运行效率?
缓存命中率 缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比,可以衡量缓存使用的好坏.命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好. 实际上,缓存是 ...
- mysql的mod函数
取余是用函数mod(numer1,number2),其返回的值为其余数值 如:mod(id,2) = 1 返回id号是奇数的id
- bzoj3991 [SDOI2015]寻宝游戏 树链的并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3991 题解 貌似这个东西叫做树链的并,以前貌似写过一个类似的用来动态维护虚树. 大概就是最终的 ...
- thinkphp 响应对象response
1.可以通过修改配置文件的 default_return_type修改输出类型 // 默认输出类型 'default_return_type' => 'html', 2. 可以通过Config类 ...
- macOS gcc g++ c++ cc
安装完Xcode之后,系统中默认的编译器不再是Gcc系列,编译一些库的时候经常产生问题. 在PATH变量中设置symbol link,把gcc,g++,c++,cc全链接到Gcc系列.
- git 常用命令记录
删除远程分支 git push origin --delete 远程分支名 删除本地分支 git branch -d 本地分支名 从master新建分支 git checkout -b 新分支名 建立 ...
- MyBatis 中的#和$的区别
#相当于对数据 加上 双引号,$相当于直接显示数据 #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的 ...