如何在自定义类中更新Worker/Task线程的进度?
解决Worker/Task线程内自定义类更新进度的问题
问题根源
你在Task的匿名内部类中定义了notifyTask方法,但DocumentProcessor的proces方法参数是Task类型——而Task类本身并没有提供这个方法,因此编译时会提示“方法不存在”。
解决方案:用回调接口解耦
定义一个进度回调接口,让Task的匿名子类实现该接口,再将接口实例传递给DocumentProcessor,即可安全调用进度更新方法。
1. 定义进度回调接口
public interface ProgressCallback { void notifyTask(String msg, long stepNumber, long totalSteps); }
2. 修改Task匿名类实现接口
public Task createWorker() { // 匿名类继承Task,同时实现ProgressCallback接口 Task task = new Task() { @Override protected Object call() throws Exception { DocumentProcessor dp = new DocumentProcessor(); // 将当前实例强制转换为ProgressCallback类型传入 dp.proces((ProgressCallback) this); // Task的call方法必须返回Object类型,按需返回对应值 return null; } // 实现ProgressCallback接口的方法 @Override public void notifyTask(String msg, long stepNumber, long totalSteps) { // 调用Task内置方法更新进度和消息 updateMessage(msg); updateProgress(stepNumber, totalSteps); } }; return task; // 原代码缺少return语句,需补充返回创建的Task实例 }
3. 调整DocumentProcessor接收接口参数
public class DocumentProcessor { // 方法参数改为ProgressCallback接口类型 public void proces(ProgressCallback callback){ // 执行步骤1并更新进度 callback.notifyTask("Step 1 done", 1 ,2); // 执行步骤2并更新进度 callback.notifyTask("Step 2 done", 2 ,2); } }
4. 调用代码(无需修改,确保Task实例被正确返回)
Task worker = createWorker(); new Thread(worker).start();
关键注意事项
- 若使用JavaFX的
Task类,其updateMessage和updateProgress方法本身已做线程安全处理,可直接在后台线程调用。 - 匿名类必须实现
call方法的返回值,否则会编译失败。 - 强制转换为
ProgressCallback时,需确保匿名类确实实现了该接口的所有方法。
内容的提问来源于stack exchange,提问作者user10053673
相关产品推荐
相关产品推荐

