java--基础--17.1--线程--实现多线程,线程方法

2023-11-11

java–基础–17.1–线程–实现多线程,线程方法


1、概念

  • 进程:正在运行的程序。每个进程可以由多个线程组成;
  • 线程:是进程中的单个顺序控制流,是一条执行路径。
  • 并行:指在某一个时间点执行多个任务
  • 并发:指在某一个时间段执行多个任务

2、实现多线程有2种方式

2.1、继承继承Thread类,重写run()方法,run()是包含被线程执行的代码



public class MyThread extends Thread {
	public MyThread() {
		super();
	}
	public MyThread(String name) {
		super(name);
	}

	@Override
	//run()用来包含那些被线程执行的代码。
	public void run() {
	for (int i = 0; i < 10; i++) {
		System.out.println(Thread.currentThread().getName()+"  :"+i);
	}
	}

}

测试:
		MyThread my1 = new MyThread();
		MyThread my2 = new MyThread();
		//设置线程名称
		my1.setName("my1");
		my2.setName("my2");

		my1.start();
		my2.start();
		//打印当前线程名字
		System.out.println(Thread.currentThread().getName());
输出:
main
my2  :0
my2  :1
my2  :2
my2  :3
my2  :4
my2  :5
my2  :6
my2  :7
my2  :8
my2  :9
my1  :0
my1  :1
my1  :2
my1  :3
my1  :4
my1  :5
my1  :6
my1  :7
my1  :8
my1  :9

2.2、实现Runnable接口,重写run()方法

public class MyRunnable implements Runnable {

	@Override
	public void run() {
		for (int x = 0; x < 10; x++) {
			System.out.println(Thread.currentThread().getName() + ":" + x);
		}
	}

}
	public static void main(String[] args) {
		// 创建MyRunnable类的对象
		MyRunnable my = new MyRunnable();


		Thread t1 = new Thread(my, "线程1");
		Thread t2 = new Thread(my, "线程2");
		t1.start();
		t2.start();
		//打印当前线程名字
		System.out.println(Thread.currentThread().getName());
	}
输出:
main
线程1:0
线程1:1
线程1:2
线程1:3
线程1:4
线程1:5
线程1:6
线程1:7
线程1:8
线程1:9
线程2:0
线程2:1
线程2:2
线程2:3
线程2:4
线程2:5
线程2:6
线程2:7
线程2:8
线程2:9

3、线程的方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、线程方法测试

public class MyThread extends Thread {
	@Override
	public void run() {
		for (int x = 0; x < 5; x++) {
			System.out.println(getName() + ":" + x);
		}
	}
}

4.1、public final void setDaemon(boolean on)

将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。

	MyThread my1 = new MyThread();
		MyThread my2 = new MyThread();

		my1.setName("线程1");
		my2.setName("线程2");

		// 设置守护线程
		my1.setDaemon(true);
		my2.setDaemon(true);
//		Thread.currentThread().setDaemon(true);//当正在运行的线程都是守护线程时,Java 虚拟机退出。

		my1.start();
		my2.start();

		for (int x = 0; x < 5; x++) {
			System.out.println(Thread.currentThread().getName() + ":" + x);
		}
	}
输出:
main:0
main:1
线程1:0
线程2:0
线程2:1
线程2:2
main:2
线程2:3
线程2:4
线程1:1
线程1:2
线程1:3
线程1:4
main:3
main:4

4.2、public final void join()

等待该线程终止/阻塞调用该方法的主线程。

		MyThread my1=new MyThread();
		MyThread my2=new MyThread();
		MyThread my3=new MyThread();
		my1.setName("线程1");
		my2.setName("线程2");
		my3.setName("线程3");
		my1.start();
		try {
			//等待该线程终止。 my1线程结束完才会执行下去,主线程wait堵塞,直到my1完成才唤醒主线程
			my1.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		my2.start();
		my3.start();
	}
输出:
线程1:0
线程1:1
线程1:2
线程1:3
线程1:4
线程2:0
线程2:1
线程2:2
线程2:3
线程3:0
线程2:4
线程3:1
线程3:2
线程3:3
线程3:4


4.3、线程优先级:代表获取cpu时间片几率的高低

  • public final int getPriority():返回线程对象的优先级
  • public final void setPriority(int newPriority):更改线程的优先级。
  • 注意:
    • 线程默认优先级是5。
    • 线程优先级的范围是:1-10。
	public static void main(String[] args) {
		MyThread my1 = new MyThread();
		MyThread my2 = new MyThread();
		MyThread my3 = new MyThread();

		my1.setName("线程1");
		my2.setName("线程2");
		my3.setName("线程3");

		// 获取默认优先级
		 System.out.println("线程1优先级"+my1.getPriority());
		 System.out.println("线程2优先级"+my2.getPriority());
		 System.out.println("线程3优先级"+my3.getPriority());
		//设置正确的线程优先级
		my1.setPriority(10);
		my3.setPriority(1);
		 System.out.println("线程1优先级"+my1.getPriority());
		 System.out.println("线程2优先级"+my2.getPriority());
		 System.out.println("线程3优先级"+my3.getPriority());
		 
		 System.out.println("------------------测试---------------");
		my1.start();
		my2.start();
		my3.start();
	}
}

输出:
线程1优先级5
线程2优先级5
线程3优先级5
线程1优先级10
线程2优先级5
线程3优先级1
------------------测试---------------
线程1:0
线程1:1
线程3:0
线程1:2
线程1:3
线程1:4
线程2:0
线程2:1
线程2:2
线程2:3
线程2:4
线程3:1
线程3:2
线程3:3
线程3:4

4.4、线程休眠 public static void sleep(long millis),此时线程会停止,等时间过了,在继续

		MyThread my1 = new MyThread();
		MyThread my2 = new MyThread();
		MyThread my3 = new MyThread();

		my1.setName("线程1");
		my2.setName("线程2");
		my3.setName("线程3");

		my1.start();
		my1.sleep(3*1000);
		System.out.println("线程1结束完了");
		my2.start();
		my3.start();
输出:

线程1:0
线程1:1
线程1:2
线程1:3
线程1:4
线程1结束完了
线程2:0
线程3:0
线程2:1
线程3:1
线程2:2
线程3:2
线程2:3
线程3:3
线程2:4
线程3:4

4.5、线程中断

  • public void interrupt():线程中断。
    • 发出中断请求,状态改为true。
    • 线程中断,不是停止线程,只是一个线程的标志位属性。
    • 如果线程状态为被阻塞状态(sleep、wait、join 等状态),线程状态退出被阻塞状态,并抛出异常InterruptedException,并重置中断状态为默认状态 false。
  • interrupted:检查是否中断,并清除中断状态
  • isinterrupted:检查是否中断,不清除中断状态
public class MyThread implements Runnable {
 
    @Override // 可以省略
    public void run() {
        // 一直 run
        while (true) {
        }
    }
 
    public static void main(String[] args) throws Exception {
 
        Thread myThread = new Thread(new MyThread());
        myThread.start();
 
        TimeUnit.SECONDS.sleep(2);
        System.out.println("设置中断状态为true");
        myThread.interrupt();
        System.out.println("线程的中断状态为: " + myThread.isInterrupted());
        TimeUnit.SECONDS.sleep(2);
        System.out.println("线程的运行状态为: " + myThread.getState());
    }
}

结果:
设置中断状态为true
线程的中断状态为: true
线程的运行状态为: RUNNABLE

4.5、public static void yield():暂停当前正在执行的线程对象,并执行其他线程。

public class MyThread extends Thread {
	@Override
	public void run() {
		for (int x = 0; x < 10; x++) {
			System.out.println(getName() + ":" + x);
			Thread.yield();
		}
	}
}


		MyThread ty1 = new MyThread();
		MyThread ty2 = new MyThread();

		ty1.setName("线程1");
		ty2.setName("线程2");

		ty1.start();
		ty2.start();
输出:

线程1:0
线程2:0
线程1:1
线程2:1
线程2:2
线程2:3
线程2:4
线程2:5
线程1:2
线程2:6
线程1:3
线程1:4
线程2:7
线程1:5
线程2:8
线程2:9
线程1:6
线程1:7
线程1:8
线程1:9

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java--基础--17.1--线程--实现多线程,线程方法 的相关文章

  • OSGi:将参数传递给特定包

    我有一个带有自定义 Main 类的自定义 jar 它启动 OSGi 框架并安装 启动捆绑包 这个主 jar 还包括一个属性文件 目标 我有一个包 A 它应该以某种方式获取主 jar 的该属性文件的属性 我的第一次尝试是在捆绑包 A 中定义一
  • 从 PDF 中提取不可选择的内容

    我正在使用 Apache PDFBox 从 PDF 文件中提取页面 但找不到提取不可选择的内容 文本或图像 的方法 从 PDF 文件中选择内容是没有问题的 请注意 相关 PDF 在复制内容方面没有任何限制 至少从我在文件的 文档限制摘要 中
  • 将比较器对象存储在数组中

    我为我的对象定义了 4 个比较器 如下所示 public static Comparator
  • 数组查找时间复杂度和。它是如何存储的

    众所周知 通过索引访问数组的时间复杂度是O 1 Java 的文档ArrayList 它由数组支持 对其也有同样的说法get手术 size isEmpty get set iterator 和 listIterator 操作以恒定时间运行 查
  • 编译错误:Android Studio

    我正在尝试修改基于 IntelliJ 构建的现有 Android 项目 我已经搜索并尝试了很多东西 但我的错误仍然没有消失 Error 5 1 android apt compiler main D android tinynote app
  • 面试问题 - 在排序数组 X 中搜索索引 i,使得 X[i] = i

    昨天面试时 我被问到了以下问题 考虑一个 Java 或 C 数组X它已排序并且其中没有两个元素是相同的 如何最好地找到索引i这样该索引处的元素也是i 那是X i i 作为澄清 她还给了我一个例子 Array X 3 1 0 3 5 7 in
  • Android 上的 setTimeOut() 相当于什么?

    我需要等效的代码setTimeOut call function milliseconds 对于安卓 setTimeOut call function milliseconds 您可能想查看定时任务 http developer andro
  • 如何使用 log4j 自动记录类中调用的每个方法

    我有一个包含数据库调用的类 我通常希望使用 log4j 记录该类中调用的每个方法 带参数 logger debug foo id id initiated 可以自动执行此操作吗 也许通过在每个方法的开头使用某种注释而不是编写每个 logge
  • lombok - 多个镜头中的 @Builder 模式

    I use Builder of 龙目岛项目 https github com rzwitserloot lombok 所以考虑我有这个例子 Builder public class Client private Getter Setter
  • 仅使用 ServletContext 查找应用程序的 URL

    我正在使用 Spring MVC 编写一个 Java Web 应用程序 我有一个后台进程 它会遍历数据库并查找必须通过电子邮件发送给我的用户的通知 这些电子邮件需要包含应用程序的超链接 对于网络应用程序来说 这似乎是相当常见的模式 但我遇到
  • 将 Spring Boot 应用程序部署到 Heroku 失败并显示“无效标志:--release -> [帮助 1]”

    当我尝试将代码部署到 Heroku 时 通过git push heroku master 我收到 Maven 错误 remote ERROR Failed to execute goal org apache maven plugins m
  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • Spring Batch:比较数据库之间的数据

    我有两个数据库 Oracle 和 MySQL 目标是将Oracle表中的值保存到MySQL中 要求 MySQL表中不存在数据 但我在理解 Spring Batch 时遇到了困难 步骤中 它包含itemReader itemProcessor
  • 如何提高 Guice 启动时的性能

    好吧 我知道我的计算不客观等等 但无论如何 我讨厌在执行单元测试时等待这么多时间 我的 guice swing 应用程序需要大约 7 秒来初始化 这是一个简单的 IRC 客户端 在那一刻 没有打开连接 我什至还没有调用任何 java io
  • 如何将我的自定义相机应用程序设置为默认应用程序?

    如果我使用以下代码 Intent takePictureIntent new Intent MediaStore ACTION IMAGE CAPTURE startActivityForResult takePictureIntent 1
  • 使用 Java 进行 AES 加密并使用 Javascript 进行解密

    我正在制作一个需要基于 Java 的 AES 加密和基于 JavaScript 的解密的应用程序 我使用以下代码作为基本形式进行加密 public class AESencrp private static final String ALG
  • 如何实现再次播放功能?

    我希望在游戏结束时得到提示 如果我还想再玩一次的话 并使用 Y N 输入 退出游戏或重复游戏 我该如何以最有效的方式解决这个问题 编辑 描述资源路径位置类型 类型 Main Main java ScaredyCat src se grupp
  • 在调试模式下,哪些代码更改会自动反映在 Eclipse 中?

    我使用 eclipse 用于编写 调试 作为 IDE 在调试模式下 当我进行一些更改 例如初始化局部变量 时 它们会自动反映 但其他更改例如更改静态变量的值 有时我会收到一条消息 说我需要重新启动虚拟机 有时则不需要 现在的问题是哪些类型的
  • PSQLException:错误:关系“TABLE_NAME”不存在

    我正在尝试在 PostgreSQL 8 4 2 DB 上运行休眠 每当我尝试运行简单的java代码时 例如 List
  • Spring JMS开始根据请求监听jms队列

    Spring提供 JMSListener用于监听来自特定队列的消息的注释 还有一个替代方案实施JmsListenerConfigurer http docs spring io spring docs current spring fram

随机推荐