java两个线程同时运行_java如何几乎同时结束两个线程

这篇博客探讨了如何在Java中使两个线程几乎同时开始和结束。作者通过创建一个文字显示和音乐播放的程序,尝试了两种结束线程的方法:使用`System.exit(0)`直接终止和通过共享静态变量控制。然而,这两种方法都无法立即停止音乐播放线程。作者寻求更好的解决方案,指出`interrupt()`方法在此场景下并不适用。
摘要由CSDN通过智能技术生成

今天写了一个让文字何背景音乐几乎同时开始几乎同时结束的小程序,但是遇到了一个问题,就是如何同时结束两个线程的问题

我想到的第一种方式,因为只有两个线程可以直接终止;System.exit(0);

第二种方式; 如果不能正常开启音乐播放t线程t线程就结束了,使用静态属性,打boolean的方式,终止音乐播放程序但是没有办法立即停止while (flag) { //没有办法立即停止;

try {

//将音乐文件放到play;

Player player = new Player(new FileInputStream((new File(path))));

player.play(); //播放音乐;

} catch (JavaLayerException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

以下为源码

读取文件import java.awt.*;

import java.awt.datatransfer.StringSelection;

import java.awt.event.KeyEvent;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.util.Random;

/*

* runtime 类构造方法私有;--->单例模式;

* * */public class showLove {

public static boolean falg=true;

public static void main(String[] args) throws IOException {

// 使用了单例模式; 使用Runtime 中自带的exec 方法,以command 命令的方式打开window下的程序

Runtime rt=Runtime.getRuntime();

rt.exec("notepad");

Thread t=new Thread( ()->{

Musicutil.play("C:Users86152Musicやなぎなぎ - ユキトキ (雪融) (TV Size).mp3");

// 单线程要一行一行的执行,所以如果为单线程,就会播放音乐完成后再播放音乐;

});

t.start(); //开启音乐线程;

try {

Thread.sleep(2000);

} catch (InterruptedException e) {

e.printStackTrace();

}

// 读取文件;

readFile("C:Users86152Desktopjava练习content.txt");

// 强行终止进程以达到结束两个线程的;

}

// 判断主线程是否执行完毕;

public static boolean judgeOfThread(){

return true;

}

/**

* 读取文件

* @param path //文件的路径

*/

public static void readFile(String path){

// 自动关闭try with resources; JDK1.7新特性

try( FileReader fr=new FileReader(path)){

int c;

while( (c=fr.read()) !=-1){

//将读取的部分转化为字符串;

copyAndPaste(String.valueOf((char) c));

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 将数据粘贴到文件中;

* @param str

*/

public static void copyAndPaste(String str){

//创建StringSelection对象,将str() 放入;

StringSelection stringSelection=new StringSelection(str);

Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection,stringSelection);

// ctrl V;---.模拟ctrl v 的执行;

Robot robot=null;

try {

robot = new Robot();

} catch (AWTException e) {

e.printStackTrace();

}

// 两个键的按下;

robot.keyPress(KeyEvent.VK_CONTROL);

robot.keyPress(KeyEvent.VK_V);

//键盘的松开;

robot.keyRelease(KeyEvent.VK_V);

robot.keyRelease(KeyEvent.VK_CONTROL);

// 随机的delay() 延迟;

Random random=new Random();

int delay= random.nextInt(600); //随机数的边界

if(delay<100){

delay+=200;

}

robot.delay(delay); //单位为毫秒;

}

}

播放音乐 ,使用了外接jar包import javazoom.jl.decoder.JavaLayerException;

import javazoom.jl.player.Player;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

/**

* 播放音乐

* */

public class Musicutil{

public static void play(String path) {

//player是一个流对象;

while (true) { //没有办法立即停止;

try {

//将音乐文件放到play;

Player player = new Player(new FileInputStream((new File(path))));

player.play(); //播放音乐;

} catch (JavaLayerException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

}

}

想问问有更好的解决方案吗 .interrput() 方法在这好像不好使用,希望大神们给我提出更好的解决方案;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值