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

我想到的第一种方式,因为只有两个线程可以直接终止;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() 方法在这好像不好使用,希望大神们给我提出更好的解决方案;

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

  1. java两个线程同时运行_Java实现的两个线程同时运行案例

    本文实例讲述了Java实现的两个线程同时运行.分享给大家供大家参考,具体如下: /** * 两个案例同时运行案例 * 1:这个两个线程并不是有规律的运行而是有没有规律的交替运行 */ package ...

  2. java线程本地变量_Java并发编程示例(九):本地线程变量的使用

    这篇文章主要介绍了Java并发编程示例(九):本地线程变量的使用,有时,我们更希望能在线程内单独使用,而不和其他使用同一对象启动的线程共享,Java并发接口提供了一种很清晰的机制来满足此需求,该机制称 ...

  3. java web 服务 构建与运行_Java Web 服务:构建与运行(影印版)

    基本详情信息 书名:Java Web 服务:构建与运行 ISBN:9787564119270 作者:卡林(Martin Kalin) 著 出版社:东南大学出版社 出版日期:2010-1-1 其他信息 ...

  4. 主线程和子线程的关系(讨论主线程结束,子线程是否要回收)

    主线程和子线程,在操作系统里面其实是一样的,没有本质区别.至于主线程结束,子线程是否要回收,下面有两种比较特殊的情况. 第一种: 主线程退出了,子线程还可以执行. 主要是因为pthread_exit函 ...

  5. java 日期只计算年月日大小_Java按自然月计算两个日期相差的年月日?

    曾经我以为计算两个日期之差很简单,在给我的团队成员分配任务时,也觉得就是调用一个方法的问题,可是当我发现结果老是不对时,才发现原来JDK 提供的API中根本没有这样的方法,我也很恼火,也怪不得不少牛人 ...

  6. java的class怎么直接运行_java生成class文件怎样方便的直接运行

    今天有朋友问我class怎样转exe.后来了解到是他嫌真接运行class文件不方便.首先java有运行环境jre,不过它只能自如的运行窗口类程序.并且要精心打包成jar文件.关于这个我今天在这不多写, ...

  7. java子线程的创建_Java多线程基础(一):线程的创建

    多线程基础 并行与并发 并发是指一个处理器同时处理多个任务. 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务. 打个比方:在并发的状态下,餐厅里只有一个厨师,尽管他做事利索,餐厅的客人等待 ...

  8. java中获取绝对值的方法_Java完美判断绝对值的两种方法 | 彬菌

    版权声明:转载原创文章请以超链接形式请注明原文章出处,尊重作者,尊重原创! 恰饭广告 if-else语句判断: import java.util.Scanner; public class Absol ...

  9. android子线程没有运行完,android假如主线程依赖子线程A的执行结果,如何让A执行完成,之后主线程再往下执行呢?...

    /* String ObjectResult="原先的结果"; //使用VOLLY框架(与问题无关) JsonObjectRequest jsonObjectRequest = n ...

最新文章

  1. html分页自动加载数据库,AngularJS实现分页显示数据库信息
  2. python 装饰器 参数-python装饰器的详细解析
  3. SUSE Linux SFTP服务器配置
  4. 用系统滚动条实现NumericUpDown的原理
  5. android 起动APP时锁住(Lock apps)
  6. voc_eval.py:41: RuntimeWarning: invalid value encountered in greater_equal if np.sum(rec = t) ==
  7. JQuery动态创建Form
  8. 2017年山东省ACM省赛总结
  9. 【转】asp.net mvc生成验证码
  10. Windows下将nginx安装为服务运行
  11. RedisPlus图形化客户端-支持集群的访问
  12. 和gdi绘图效率比较_绘图计算器测评来袭!哪一款才是你AP考试的最佳拍档?
  13. Objects.requireNonNull 方法说明
  14. 开启ntp_飒,NTP时钟服务器在银行大楼系统方案
  15. 通过srvctl add命令添加database信息到srvctl管理器
  16. 转--大话session
  17. vue canvas —— 将两张图片合成一张
  18. java枚举ordinal()接口怎么用,java.lang.Enum.ordinal()方法实例
  19. 享元模式——滴滴打车的共享经济思维
  20. C++语言Switch函数使用小贴士

热门文章

  1. HiCar基本功能介绍
  2. 用于ONNX的TensorRT后端
  3. SLAM的通用框架:GSLAM
  4. 深度学习常见问题解析
  5. 使用Servlet完成单表的CRUD
  6. TCP/UDP对比总结
  7. 用gogs搭建属于自己的git网站
  8. Invoking Page() in async task.
  9. ClassCastException
  10. Rendering Problems Exception raised during rendering: