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类的对象。

  1. public class Demo {
  2. public static void main(String[] args) {
  3. Thread t1 = new DemoThread("线程一");
  4. Thread t2 = new DemoThread("线程二");
  5. t1.start();
  6. t2.start();
  7. }
  8. }
  9.  
  10. class DemoThread extends Thread {
  11. public DemoThread(String name) {
  12. this.setName(name);
  13. }
  14.  
  15. @Override
  16. public void run() {
  17. for (int i = 0; i < 100000; i++) {
  18. System.out.println(Thread.currentThread().getName() + " >>> " + i);
  19. }
  20. }
  21. }

◆ 创建传入一个实现了Runnable接口的类的Thread对象。

  1. public class Demo {
  2. public static void main(String[] args) {
  3. DemoThread dt = new DemoThread();
  4. Thread t1 = new Thread(dt, "线程一");
  5. Thread t2 = new Thread(dt, "线程二");
  6. t1.start();
  7. t2.start();
  8. }
  9. }
  10.  
  11. class DemoThread implements Runnable {
  12. @Override
  13. public void run() {
  14. for (int i = 0; i < 100000; i++) {
  15. System.out.println(Thread.currentThread().getName() + " >>> " + i);
  16. }
  17. }
  18. }

线程的常用属性和方法

属性

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:线程刚创建时具有的状态。

  1. public static void main(String[] args) {
  2. Thread thread = new Thread();
  3. System.out.println(thread.getState());
  4. }

RUNNABLE:线程正在运行,线程获取CPU的时间片。

  1. public static void main(String[] args) {
  2. Thread thread = new Thread();
  3. thread.start();
  4. System.out.println(thread.getState());
  5. }

BLOCKED:线程进入阻塞状态。假如有两个都是同步安全的线程,当一个线程处于RUNNABLE状态时,则另一个线程处于BLOCKED状态。

  1. public static void main(String[] args) {
  2. Thread t1 = new Thread() {
  3. public void run() {
  4. synchronized (Object.class) {
  5. try {
  6. Thread.sleep(1000);
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. }
  12. };
  13. Thread t2 = new Thread() {
  14. public void run() {
  15. synchronized (Object.class) {
  16. try {
  17. Thread.sleep(1000);
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. }
  23. };
  24. t1.start();
  25. t2.start();
  26. try {
  27. Thread.sleep(100);
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. System.out.println(t2.getState());
  32. }

WAITTING:程序处于等待状态,调用wait()、join()、await()、lock()等方法,都会使线程处于WAITTING状态,需要注意的是这些方法必须是无参数的。

  1. public static void main(String[] args) {
  2. Thread t = new Thread() {
  3. public void run() {
  4. synchronized (Object.class) {
  5. try {
  6. join();
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. }
  12. };
  13. t.start();
  14. try {
  15. Thread.sleep(100);
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. System.out.println(t.getState());
  20. }

TIMED_WAITING:程序处于限时等待状态,调用wait()、join()、await()、lock()、sleep()等方法,都会使线程处于TIMED_WAITING状态,需要注意的是这些方法必须加入参数。

  1. public static void main(String[] args) {
  2. Thread t = new Thread() {
  3. public void run() {
  4. synchronized (Object.class) {
  5. try {
  6. Thread.sleep(1000);
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. }
  11. }
  12. };
  13. t.start();
  14. try {
  15. Thread.sleep(100);
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. System.out.println(t.getState());
  20. }

Java多线程——线程的创建方式的更多相关文章

  1. 面试官:小伙子,说一说Java多线程有哪些创建方式吧

    第一种 继承Thread类 自定义类,继承Thread类,并重写run()方法. class MyThread1 extends Thread { @Override public void run( ...

  2. 【Java】线程的创建方式

    1.继承Thread类方式 这种方式适用于执行特定任务,并且需要获取处理后的数据的场景. 举例:一个用于累加数组内数据的和的线程. public class AdditionThread extend ...

  3. java 多线程5(创建方式)

    实现Runnable接口: 问题1:Runnable实现类的对象是线程对象吗? 答:不是,该对象只不过是实现了Runnable接口的对象而已,只有是Thread或Thread的子类才是线程对象. 问题 ...

  4. Java:多线程概述与创建方式

    目录 Java:多线程概述与创建方式 进程和线程 并发与并行 多线程的优势 线程的创建和启动 继承Thread类 start()和run() 实现Runnable接口 实现Callable接口 创建方 ...

  5. Java多线程--线程及相关的Java API

    Java多线程--线程及相关的Java API 线程与进程 进程是线程的容器,程序是指令.数据的组织形式,进程是程序的实体. 一个进程中可以容纳若干个线程,线程是轻量级的进程,是程序执行的最小单位.我 ...

  6. Java多线程——线程之间的同步

    Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,如何使用volatile关键字,如何使用synchronized修饰的同步代码块和同步方法解决线程安全问题. 部分内容来自以 ...

  7. Java多线程--两种实现方式

    进程概述: 在这之前,有必要了解一下什么是进程? 在一个操作系统中,每个独立的执行的程序都可称为一个进程,也就是"正在运行的程序".如图所示: 线程概述: 如上所述,每个运行的程序 ...

  8. Java多线程——线程的优先级和生命周期

    Java多线程——线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...

  9. 使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点?

    我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用 ...

随机推荐

  1. android 开发中用到的工具-持续更新(码农必看)

    1. vim 单文件查看改动利器(一直使用支持各种编码各种文件,各种插件),欢迎下载笔者插件 git clone https://github.com/green130181/vim-conf.git ...

  2. MySQL 存储过程传參之in, out, inout 參数使用方法

    存储过程传參:存储过程的括号中.能够声明參数. 语法是 create procedure p([in/out/inout] 參数名  參数类型 ..) in :给參数传入值,定义的參数就得到了值 ou ...

  3. rhel6 中安装使用finger命令

    rhel6中默认没有finger 命令, 到rpm 包网上没有找到合适的, 然后在终端中输入rpm -qa|grep finger 查到了其相关的一个rpm包, 然 yum install finge ...

  4. 转:目前为止最全的微信小程序项目实例

    wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...

  5. POJ1236 Network of Schools —— 强连通分量 + 缩点 + 入出度

    题目链接:http://poj.org/problem?id=1236 Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Tot ...

  6. inexact rename detection was skipped due to too many files

    https://stackoverflow.com/a/28064699 error: add_cacheinfo failed to refresh for path 'LISA.Kentico.U ...

  7. div+css布局教程系列1

    <!doctype html><html><head><meta charset="utf-8"><title>简单布局 ...

  8. 通过minicom传送文件的相关配置及使用方法

    写一下我使用串口向开发板传送文件中遇到的问题及解决办法: 使用的软硬件环境: 虚拟机:VMware® Workstation 8.0.1 Linux操作系统:Fedora 9 开发板:mini6410 ...

  9. bzoj 1898

    1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1197  Solved: 661[Submit][S ...

  10. ubuntu16.04下使用python3开发时,安装pip3与scrapy,升级pip3

    1)安装pip3: sudo apt-get install python3-pip 2)安装scrapy sudo pip3 install scrapy 若出现版本过低问题: pip3 insta ...