Java 同步无限循环服务';s初始化部分

Java 同步无限循环服务';s初始化部分,java,concurrency,synchronization,Java,Concurrency,Synchronization,我正在尝试实现一段代码,以便在Java中同步启动循环服务。其思想是,应该将//STARTER注释下的代码视为Service.go()方法的一部分,因此如果服务无法启动,我希望同步重新抛出异常。只有当我尝试启动线程,等待它的执行流到达某个点,然后,如果没有问题,我的go()方法退出,线程继续运行,或者,如果有问题,我可以从我的go()重新抛出线程的run()方法捕获的异常时,这段代码才应该完成方法。这是一个似乎很好的解决方案,但我很好奇是否有可能将它缩短几倍:-) 另外,在该线程中执行初始化代码有

我正在尝试实现一段代码,以便在Java中同步启动循环服务。其思想是,应该将
//STARTER
注释下的代码视为
Service.go()
方法的一部分,因此如果服务无法启动,我希望同步重新抛出异常。只有当我尝试启动线程,等待它的执行流到达某个点,然后,如果没有问题,我的
go()
方法退出,线程继续运行,或者,如果有问题,我可以从我的go()重新抛出线程的
run()
方法捕获的异常时,这段代码才应该完成方法。这是一个似乎很好的解决方案,但我很好奇是否有可能将它缩短几倍:-)

另外,在该线程中执行初始化代码有一个原因,因此,请不要建议在
go()
方法中显式运行初始化代码,然后将所有内容传递给线程


谢谢

重写
Thread.start()方法怎么样

public static void main(String[] args) {
    Thread t = new Thread() {
        public void run() {
            while (true) {
                try {
                    System.out.printf("working...\n");
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.printf("interrupted\n");
                }
            }
        }

        @Override
        public synchronized void start() {
            try {
                init();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            super.start();
        }

        private void init() throws Exception {
            throw new Exception("test");
        }
    };

    t.start();
}

我相信,Thread.start()是在调用方的线程中执行的。那我猜你得等一把普通锁。
public static void main(String[] args) {
    Thread t = new Thread() {
        public void run() {
            while (true) {
                try {
                    System.out.printf("working...\n");
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.printf("interrupted\n");
                }
            }
        }

        @Override
        public synchronized void start() {
            try {
                init();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            super.start();
        }

        private void init() throws Exception {
            throw new Exception("test");
        }
    };

    t.start();
}