java线程中的run方法怎样算是结束?

代码如下:

 import java.applet.Applet;
import java.applet.AudioClip;

public class SoundEffect {  
    public static void playSound(){ 
        new PlayThread().start();
    }
}

class PlayThread extends Thread{
        private AudioClip ac;
        PlayThread(){
            ac = Applet.newAudioClip(SoundEffect.class.getResource("/resources/sound/a.wav"));
        }
        public void run() {
                ac.play();      
        }
    }

run方法会调用一次audioclip的play()方法,结束之后线程会自动销毁对吧?
可是声音播放是有一段时间的,线程是如何知道声音播放完成了呢?

5个回答

如果你必须知道线程结束的这个动作,可以使用Callable这个多线程的类,可以接收运行的返回结果。
使用起来和Thread差不多,你百度看下就知道了。只是多了一个返回值。而且在运行线程可以设置是否需要接收返回值

zhloCathy
入梦叶 感谢启发,callable的确可以获得返回值,通过future的isdone判断线程是否结束。我用这个方法写了一段测试代码,用CachedThreadPool来管理线程,发现声音可以完整播放,而callable也只用了14ms就返回了结果。可以认为是ac的播放和调用ac的线程是独立的?但是如果直接用FutureTask来执行线程的话,结果是线程迅速结束,而声音却无法播放。似乎问题的关键在于选择用ExecutorService还是直接调用start方法来启动线程。虽然不懂原理,但是问题好像已经解决了。。
接近 2 年之前 回复

我是不知道。但是你可以设置一个大概的时间,比如声音播放的时间是5s你想进行下一个任务的时候让其sleep 5s应该就可以啦

zhloCathy
入梦叶 我只想让这个声音播放一次,所以希望播放完成后线程能够自动结束,但是貌似实际上没有真正开始播放线程已经结束了。用sleep是一个解决方案,如果能获取ac的时长设定sleep的长度就更好了。我更希望的是搞清楚线程和play之间是如何运作的。
接近 2 年之前 回复

run方法调用了ac.play方法,play方法执行完,run方法才会继续下一行代码,之后线程结束。

zhloCathy
入梦叶 事实上并不是这样的,如果实例化很多个AudioClip对象依次play的话,所有的ac会同时播放,而不是一个播放完毕才继续播放下一个。
接近 2 年之前 回复

执行完成自动结束,或者获取执行线程调stop()方法终止或dead方式杀死,如果线程存在阻塞也可用interrupt方法终止线程

如果ac.play()是在当前线程跑的话,那就要一直阻塞到play()方法结束。
如果play()方法是另起一条线程跑的话,那么run()就马上结束啦。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java中启动线程start和run方法的区别
Java中启动线程有两种方式,继承Thread类以及实现接口Runnable,由于Java无法实现多重继承,故经常通过实现接口Runnable来创建线程。但是无论哪种方式创建都可以通过start()和run( )方法来启动线程,下面就来介绍一下两者的区别。 start():通过该方法启动线程的同时也创建了一个线程,真正实现了多线程,这是无需等待run()方法中的代码执行完毕就可以直接执行下面
java线程的start和run方法解析
自定义线程两种方法 自定义一个runnable接口的实现类,然后构造一个thread,即对thread传入一个runnable接口类。 new一个thread或者写个thread子类,覆盖它的run方法。(new 一个thread并覆盖run方法实际上是匿名内部类的一种方式) 示例代码 public static void main(String[] args) { new T
多线程——停止线程(结束run方法)
package com.qianfeng.demo01; /** * 停止线程: * 1.stop():已过时,这种方法有固有的不安全性,强制停止线程,不论处于什么状态都会停止,就会导致线程的不安全。 * 2.run方法结束了,当线程中没有运行的代码时,线程就结束了,意味着任务结束,线程消失。 * * 考虑一个问题,怎么能让run方法结束呢? * 一般情况下,run方法当中都会定义循
Java中启动线程start和run方法
一、区别Java中启动线程有两种方法,继承Thread类和实现Runnable接口,由于Java无法实现多重继承,所以一般通过实现Runnable接口来创建线程。但是无论哪种方法都可以通过start()和run()方法来启动线程,下面就来介绍一下他们的区别。start方法:通过该方法启动线程的同时也创建了一个线程,真正实现了多线程。无需等待run()方法中的代码执行完毕,就可以接着执行下面的代码。此
线程退出run方法,是否代表该线程结束
如题
线程的start和run方法的区别
从源码看start()方法调用了本地方法start0() private native void start0(); 接下来我们看下start0是怎么回事 打开http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/ 选择browse,然后在右侧点击src --》 share --》 native --》 java --》 lang --》Thread.c 也可...
java中如何结束线程
一般来说线程执行完run()之后就自动结束了,不过有些时候我们需要线程不停的做一些事情,也就是使用while循环,那么这时候该如何停止线程呢?这个问题需要分情况来讨论,如果线程做的事情不是耗时的,那么只需要使用一个标志即可,具体的代码如下:class MyThread extends Thread { private volatile boolean isStop = false
怎样结束一个线程?
主程序中,我启动一个Socket监听线程rnTHREADINFOSTRUCT *tis=new THREADINFOSTRUCT;rnrntis->hWnd=m_hWnd;rntis->CLogHwnd=GetDlgItem(IDC_EDLog);rntis->someData="This is in a thread.";rnrnCWinThread *pThread = AfxBeginThread(Listen,(LPVOID)tis,THREAD_PRIORITY_NORMAL,0,0);rnrn怎样结束这个线程呢?rntis应该在什么时候释放??
怎样结束线程合理?
有个线程在循环处理(如果没有人来操作,将无限循环等待下去)rn现在把整个程序关上了(强制关上,这个线程仍在循环状态),在closern中用了thread:=nil;(这是用setlength分配的,我不知道在这个数组=nilrn之前需不需要用循环来让每个thread[][].distroy,需要吗?)。rn然后摧毁这个thread里使用的数据,但是出现了错误信息,就是thread在摧rn毁前已经摧毁了数据了,所以出错,正确的方法应该是怎么样的呢?
怎样结束一个线程?
我用的是AfxBeginThread(FindDataThread,this,THREAD_PRIORITY_NORMAL);rn怎么结束它?rn我用了::AfxEndThread(0,TRUE)之后,全部都没了!!!
怎样创建线程 和 结束线程
如题
怎样结束线程?
我用AfxBeginThread(funcproc,NULL)开启了一个线程,我如何结束它,请高人明示
怎样结束线程?
在关闭窗体时,若还有线程没有结束,怎样把他结束掉;
怎样结束应用程序的线程?
我在对程序进行关闭时应用rnbeginrnapplication.free;rnapplication.destroy;rnend;rn但是,delphi不能进行编译,原来是线程没有取消掉,请问如何结束程序的线程?rn
Java中线程run方法执行无限循环,调用布尔类型数据控制线程结束。
-
这样的线程怎样结束??
现在遇到一个没有办法解决的问题,请教一下各位rnrn我 A程序 启动一个 b线程 b 进程又启动了n个c线程rnrn我现在想结束 b线程包括他启动的c线程rnrn但是我不管在a中用b.stop() 还是让b退出run 都不行,请问一下,我要怎么设置才可以一下结束b和他启动的c进程rn谢谢 rn
线程里面start和run方法
两种情况 1.start  Thread t = new Thread(xx); t.start(); 2.run Thread t = new Thread(xx); t.run(); 这两种情况是有区别的。 第一种情况是另外开启线程执行run()方法。 第二张情况不会另外开启线程,会在本线程里执行run()方法,此时就相当于调用一个普通的方法。...
算法课算是结束了- -
机考考的还行,算是发挥了本小白的水平了。 有一点很气,那道拓扑的应该很快就能过的,做其他题去了,没有看这道,后来剩下5分钟过的时候,猛赶也没写完。 嗨呀。 稍微总结一下过的和没过的题。 其他4道的话,总结如下: 1.看到的时候,没有那种特别的思路,就是想着最完整的遍历找。不造有没有别的算法。 但是很坑,调用了math的abs函数,编译器就是不过 莫名其妙花了半个多小时,并且把我弄的很
Java 线程共用run方法里的代码段吗?
java的线程里run方法里的代码段,new几个Thread类一块运行时,内存中只有一套代码吧?rnrn如果是多核的话,如果有4核,那是不是内存中有4套代码比较快?
【Java】结束线程
1. 使用标志位public class ThreadEx implements Runnable { private volatile boolean isStoped = false; public void run() { while (isStoped) { // do something } } publ
关于java线程的结束。
我的程序中创建了很多线程,但是没有为每个线程提供一个标志,rn如果我在一个线程如线程A的方法中,希望终止该线程,即线程A,该怎么办。rn终止线程是stop()吗?
java结束线程的方式
java中结束线程当前推荐的唯一方式就是调用 1. Thread.interrupt(),所有线程池的shutdownNow,Future的cancel(true)方法内部都是调用了interrupt方法,在被中断线程的while循环里用 interrupted()方法判断该标志位,注意,若线程sleep时,该方法可以打断sleep并抛出 InterruptedException异常并且将in
java线程开启和结束
创建一个OneThread类,继承Thread 设置一个全局变量表示是否开启, 代码直接上: class OneThread extends Thread {// 继承Java.lang.Thread类定义线程 private boolean running = false;// 标记线程是否需要运行 public OneThread(String str){ System.o
Java线程start方法和run方法的比较
首先看看run方法是怎么来的: run方法是Runnable接口的一个抽象方法: 而Thread类实现了Runnable接口,重写了run方法: run方法里面的代码很简单,如果taget不为空,就执行target里面的run方法,为空就啥也不干,那这个targert是什么呢? target就是Thread类中的一个成员属性。这个我们待会再说。 很明显,想要执行run方法...
怎样结束线程中的一个动作?
我开一个线程用来解析网页,我要网页超过一定时间没有反应的话,结束这个网页的解析,跳到下一个。我怎样才能在线程中结束网页访问的动作,转向下个连接?谢谢
怎样在主程序中结束某个线程?
如题。主程序和线程同时在运行,当关闭主框架时就报错,可能是线程没有安全结束。想在关闭主框架时先关闭线程,应该如何实现?
线程中的run方法是否有this引用
class A implements Runnable rn public int i=1; rn public void run() rn this.i=10; rn rn rn public class Test rn public static void main(String args) rn A a=new A(); rn 11) new Thread(a).start(); rn int j=a.i; rn 13) rn rn rn what is the value of j at line 13? rn A. 1 rn B. 10 rn C. the value of j cannot be determined rn D. An error at line 11 cause compilation to fail rnAnswer:C rnrn问题1 我测试下来应该是1,为什么选C,是不是答案有问题rnrn2.这里this.i这句是否有意义,因为这里的run方法比较特殊
线程run方法中注入service报空指针
  如果在run中注入pictureLibraryServiceImpl此时会报空指针异常,pictureLibraryServiceImpl为null如何解决,如下图 这样就解决了问题  
怎样强制结束一个线程?
我在一个pthread线程中执行oracle数据库的一个长时间操作,rn中途想要关闭这个线程。rn怎样完成这个操作我却不知道了。rn希望各位大侠不吝赐教。
怎样强行结束一个线程?
在线程中调用.Net的sleep(1000000),在外部用Abort()可以结束。rn在线程中调用API的sleep(1000000),在外部用Abort()结束不了,必须等带1000000后才行。rnrn我想强行结束它应该怎么弄呢?rn
怎样通过线程名字 来结束线程
在程序中,我设置了 两个线程,并赋予不同的名字,rn中间这两个线程阻赛 rnrn最后,我想通过线程名字结束这两个线程,怎么做?
怎样在线程外结束该线程
比如按下OK启动了一个线程Arn在其执行中,按下CANCEL想结束A怎么办哪
怎样结束一个阻塞的线程?
我用用windows socket(阻塞模式)写了一个服务器端的小程序rn我为每一个连接的客户端建立了两个线程,一个用来接收数据,一个用来发送数据,接收数据的线程大概如下:rnreciveproc(...)rnrn char buffer[100];rn while(!endflag) //endflag是一个标志,用来退出线程rn rn if(recv(clientsocket,buffer,10,0)==SOCKET_ERROR))rn rn //与clientsocket断开连接rn rnrn //对buffer缓冲区的内容进行处理rn rnrnrn因为recv函数处于阻塞状态时,endflag不起作用,我该怎么退出这个线程呢(如何让recv函数返回)?rn
怎样使线程结束自己?
我从CWinThread派生自己的线程,将m_bAutoDelete=1,当我想用ExitThread()或PostQuitMessage()在线程内部调用该函数以结束该线程的运行时,主界面也随着结束掉,但应用程序并没有被销毁,那位高手遇到过类似的问题,指点一二。
怎样在线程内部知道线程结束了?
procedure Terminate; override; 不能覆盖
创建一个线程后,怎样结束线程
创建一个线程后,怎样结束线程
线程中run方法会被同步吗?
各位帮忙看看下面的代码,main方法中产生了几个线程,为什么?如果是多个线程,查看程序的运行结果,好像这个run方法被同步了啊?为什么啊。好像在后面三个线程中始终都无法访问index。rnpublic class Interfacaesharethread rn public static void main(String[] args) rn Mythread1 mythread = new Mythread1();rn Thread t1 = new Thread(mythread);rn t1.start();rn rn System.out.println(t1.getName());rn try rn Thread.sleep(2000);rn catch (InterruptedException e) rn e.printStackTrace();rn rn rn Thread t2 = new Thread(mythread);rn t2.start();rn System.out.println(t2.getName());rn Thread t3 = new Thread(mythread);rn t3.start();rn System.out.println(t3.getName());rn Thread t4 = new Thread(mythread);rn t4.start();rn System.out.println(t4.getName());rn rnrnrnclass Mythread1 implements Runnable rn int index = 0;rnrn public synchronized void run() rn System.out.println("in to Thread");rn while (index<10)rn System.out.println(Thread.currentThread().getName()rn + "is running and the index is " + index++);rn try rn Thread.sleep(2000);rn catch (InterruptedException e) rn e.printStackTrace();rn rn rn System.out.println("out of Thread " + Thread.currentThread().getName());rn rnrn
线程run方法和start方法的区别
区别 run() 只是一个普通的方法调用,不会开启新的线程。 start() 会开启新的线程,分配新的资源。里面的变量互不影响。 实例 package multithreading; public class MyThread extends Thread { String flag; public MyThread(String flag) { t
java中启动线程通过run方法与start放的区别
java中启动线程通过run方法与start放的区别 1.通过start方法启动线程,是真正的创建多线程,无需等待run方法里面的代码块执行完成后再执行run方法后面的代码块。此时start方法创建的线程处于就绪状态,等到得到cpu时间片后就执行run方法里面的代码块,run方法执行完成后,词线程结束。 2.通过run方法启动线程,并没有真正的创建多线程,此时还是只有一个主线程,调用run...
在java线程的run方法里在new多个线程可以吗?
在java线程的run方法里在new多个线程可以吗,我要写个定时器定时执行一个线程,可以不可以在这个线程的run方法里在new多个线程执行任务,执行的结果在run方法里汇总然后返回n[b]问题补充:[/b]nto 和你在一起:我用了TimerTask,然后用join等每个线程执行完后返回结果好像可以吗
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池