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--线程--实现多线程,线程方法 的相关文章

  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐