Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
359 views
in Technique[技术] by (71.8m points)

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

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

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

       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() 方法在这好像不好使用,希望大神们给我提出更好的解决方案;


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

第1个线程:播放音乐
第2个线程:输出文字
在第二个线程中输出文字前判断第一个线程是否还在运行,如果在运行再输出文字


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...