Java多线程——线程的创建方式
Java多线程——线程的创建方式
摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态。
部分内容来自以下博客:
https://www.cnblogs.com/dolphin0520/p/3913517.html
https://www.cnblogs.com/trust-freedom/p/6606594.html
线程的创建
Thread类和Runnable接口
Thread类实现了Runnable接口,实现了Runnable接口里的run()方法。
事实上,查看Thread类的实现源代码会发现Thread类是实现了Runnable接口的。
在Java中,这2种方式都可以用来创建线程去执行子任务,具体选择哪一种方式要看自己的需求。直接继承Thread类的话,可能比实现Runnable接口看起来更加简洁,但是由于Java只允许单继承,所以如果自定义类需要继承其他类,则只能选择实现Runnable接口。
不论哪种方式创建线程,都必须重写run()方法,在run()方法中定义需要执行的任务。
创建好了自己的线程类之后,就可以创建线程对象了,然后通过start()方法去启动线程。注意,不是调用run()方法启动线程,run()方法中只是定义需要执行的任务,如果调用run()方法,即相当于在主线程中执行run()方法,跟普通的方法调用没有任何区别,此时并不会创建一个新的线程来执行定义的任务。
创建线程
在Java中创建线程有两种方法:
◆ 创建继承了Thread类的对象。
public class Demo {
public static void main(String[] args) {
Thread t1 = new DemoThread("线程一");
Thread t2 = new DemoThread("线程二");
t1.start();
t2.start();
}
} class DemoThread extends Thread {
public DemoThread(String name) {
this.setName(name);
} @Override
public void run() {
for (int i = 0; i < 100000; i++) {
System.out.println(Thread.currentThread().getName() + " >>> " + i);
}
}
}
◆ 创建传入一个实现了Runnable接口的类的Thread对象。
public class Demo {
public static void main(String[] args) {
DemoThread dt = new DemoThread();
Thread t1 = new Thread(dt, "线程一");
Thread t2 = new Thread(dt, "线程二");
t1.start();
t2.start();
}
} class DemoThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100000; i++) {
System.out.println(Thread.currentThread().getName() + " >>> " + i);
}
}
}
线程的常用属性和方法
属性
priority:线程的优先级。最低为1,最高为10,默认为5。优先级高的线程获取CPU时间片的概率高。
threadStatus:线程的状态。常见的状态有NEW、RUNNABLE、BLOCKED、WAITING。
构造方法
Thread():使用这种方式创建的线程,需要重写Thread类里的run()方法。
Thread(Runnable target):使用这种方式创建的线程,需要实现Runnable接口里的run()方法。
静态方法
Thread.currentThread():获取当前运行的线程。
常用方法
void run():线程执行任务的主要代码。如果没有实现Runnable接口里的run()方法,则需要重写Thread类里的run()方法。
void start():启动线程的方法,虚拟机会调用线程的run()方法。只用调用了start()方法,才会启动一个新的线程执行定义的任务。
void sleep(long millis):本地方法,让当前线程休眠指定时间。sleep()方法不会释放占用的锁。
void join():相当于void join(0),传入0代表一直等待到结束。
void join(long millis):执行指定的线程一段时间,直到执行时间达到传入的时间长度或者线程执行完毕。
线程的状态
NEW:线程刚创建时具有的状态。
public static void main(String[] args) {
Thread thread = new Thread();
System.out.println(thread.getState());
}
RUNNABLE:线程正在运行,线程获取CPU的时间片。
public static void main(String[] args) {
Thread thread = new Thread();
thread.start();
System.out.println(thread.getState());
}
BLOCKED:线程进入阻塞状态。假如有两个都是同步安全的线程,当一个线程处于RUNNABLE状态时,则另一个线程处于BLOCKED状态。
public static void main(String[] args) {
Thread t1 = new Thread() {
public void run() {
synchronized (Object.class) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread t2 = new Thread() {
public void run() {
synchronized (Object.class) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t1.start();
t2.start();
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(t2.getState());
}
WAITTING:程序处于等待状态,调用wait()、join()、await()、lock()等方法,都会使线程处于WAITTING状态,需要注意的是这些方法必须是无参数的。
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
synchronized (Object.class) {
try {
join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(t.getState());
}
TIMED_WAITING:程序处于限时等待状态,调用wait()、join()、await()、lock()、sleep()等方法,都会使线程处于TIMED_WAITING状态,需要注意的是这些方法必须加入参数。
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
synchronized (Object.class) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(t.getState());
}
Java多线程——线程的创建方式的更多相关文章
- 面试官:小伙子,说一说Java多线程有哪些创建方式吧
第一种 继承Thread类 自定义类,继承Thread类,并重写run()方法. class MyThread1 extends Thread { @Override public void run( ...
- 【Java】线程的创建方式
1.继承Thread类方式 这种方式适用于执行特定任务,并且需要获取处理后的数据的场景. 举例:一个用于累加数组内数据的和的线程. public class AdditionThread extend ...
- java 多线程5(创建方式)
实现Runnable接口: 问题1:Runnable实现类的对象是线程对象吗? 答:不是,该对象只不过是实现了Runnable接口的对象而已,只有是Thread或Thread的子类才是线程对象. 问题 ...
- Java:多线程概述与创建方式
目录 Java:多线程概述与创建方式 进程和线程 并发与并行 多线程的优势 线程的创建和启动 继承Thread类 start()和run() 实现Runnable接口 实现Callable接口 创建方 ...
- Java多线程--线程及相关的Java API
Java多线程--线程及相关的Java API 线程与进程 进程是线程的容器,程序是指令.数据的组织形式,进程是程序的实体. 一个进程中可以容纳若干个线程,线程是轻量级的进程,是程序执行的最小单位.我 ...
- Java多线程——线程之间的同步
Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,如何使用volatile关键字,如何使用synchronized修饰的同步代码块和同步方法解决线程安全问题. 部分内容来自以 ...
- Java多线程--两种实现方式
进程概述: 在这之前,有必要了解一下什么是进程? 在一个操作系统中,每个独立的执行的程序都可称为一个进程,也就是"正在运行的程序".如图所示: 线程概述: 如上所述,每个运行的程序 ...
- Java多线程——线程的优先级和生命周期
Java多线程——线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...
- 使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点?
我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用 ...
随机推荐
- boost的内存管理
smart_ptr raii ( Resource Acquisition Is Initialization ) 智能指针系列的都统称为smart_ptr.包含c++98标准的auto_ptr 智能 ...
- 【iOS-Tips】-小贴士
[iOS-Tips]-小贴士 1:UIImage的2种加载方式: 方式一:有缓存(图片所占用的内存会一直停留在程序中) //name是图片的文件名 + (UIImage *)imageNamed:(N ...
- MVC+ZTree实现对树的CURD及拖拽操作
上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除节点,编辑 ...
- POJ - 1330 Nearest Common Ancestors(dfs+ST在线算法|LCA倍增法)
1.输入树中的节点数N,输入树中的N-1条边.最后输入2个点,输出它们的最近公共祖先. 2.裸的最近公共祖先. 3. dfs+ST在线算法: /* LCA(POJ 1330) 在线算法 DFS+ST ...
- poj中的一些线段树
poj2828 链接:http://poj.org/problem?id=2828 题解: 初始状态 首先是插入3 69 1,4结点有4个位置, 1,2结点有2个位置,小于3,因此放到1,4结点右孩子 ...
- apache-ab并发负载压力测试 不错
ab -n 3000 -c 3000 http://www.test.com/ c 100 即:每次并发3000 个 n 10000 即: 共发送3000 个请求 ab -t 60 -c 100 ht ...
- Python3中 对local和nonlocal 关键字的改善认识(新手向)
nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量. nonlocal用于声明,修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量,如下实例: #!/usr/bi ...
- zoj 3471(状态压缩DP,类似于点集配对)
Most Powerful Time Limit: 2 Seconds Memory Limit: 65536 KB Recently, researchers on Mars have d ...
- css3 混合模式mix-blend-mode background-blend-mode 以及混合模式的隔断 isolation
css 混合模式 mix-blend-mode: 让 元素内容 和 这个元素 以及 下面的元素 发生混合 background-blend-mode 背景的混合模式 可以是背景图片的混合也可以是背景图 ...
- Java Socket编程如何建立两者关系
转自:http://developer.51cto.com/art/201003/190582.htm Java Socket编程需要大家详细的学习,有关的技术一直在不断的更新.那么要如何才能掌握好有 ...