我正在开发Java MIDI应用程序。
我一直坚持调试异常,在歌曲结束时调度。正如我所期待的那样:应用程序正在播放,每次我都在检查顺序节拍位置以在应用程序播放行中表示它,就像播放器一样。
所以我想知道如何获得此Thread开始运行的源或点?
以下是一个例外输出:
Exception in thread "Thread-23" java.lang.IllegalStateException: Sequencer is not open
at org.tritonus.share.midi.TSequencer.checkOpen(TSequencer.java:296)
at org.tritonus.share.midi.TSequencer.stop(TSequencer.java:256)
at org.tritonus.midi.device.java.JavaSequencer.run(JavaSequencer.java:291)
at java.lang.Thread.run(Unknown Source)
答案 0 :(得分:3)
您可以安装一个绝对允许所有内容的安全管理器,但在被要求获得启动线程的权限时会注销。
或者,您可以使用bootclasspath选项提供替换的Thread实现并将其置于rt.jar中的实现之前,并将此替换Thread在其构造函数中记录其名称和stacktrace。
答案 1 :(得分:1)
org/tritonus/midi/device/java/JavaSequencer.java
包含以下代码:
protected void openImpl()
{
...
m_thread = new Thread(this);
...
m_thread.start();
}
所以这是一个值得寻找的地方(但这只回答了具体的情况,而不是一般的问题,如何找出线程一般在哪里开始)。
在同一个班级中还有其他地方调用this.start()
:setSequence(..)
和setTickPosition(..)
。但是,可以在班级外调用start()
。