您没有提供足够的细节来确定您的问题。所以这里有一个与你类似的工作代码的完整示例。
提示:在嵌入 JSP 之前,让您的代码像普通 Java 一样工作。
常规语法
首先我们使用当今 Java 的传统语法。
代码关键部分:
ExecutorService executorService = Executors.newSingleThreadExecutor();
for ( int i = 0 ; i < 7 ; i++ )
{
executorService.submit( new PrintUuid() );
}
executorService.shutdown();
try { executorService.awaitTermination( Long.MAX_VALUE , TimeUnit.MILLISECONDS ); } catch ( InterruptedException e ) { e.printStackTrace(); }
一个完整的示例应用程序。
package work.basil.example.simple;
import java.time.Duration;
import java.time.Instant;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class App
{
public static void main ( String[] args )
{
App app = new App();
app.demo();
}
private void demo ( )
{
System.out.println( "INFO - End of `demo` method. " + Instant.now() );
ExecutorService executorService = Executors.newSingleThreadExecutor();
for ( int i = 0 ; i < 7 ; i++ )
{
executorService.submit( new PrintUuid() );
}
executorService.shutdown();
try { executorService.awaitTermination( Long.MAX_VALUE , TimeUnit.MILLISECONDS ); } catch ( InterruptedException e ) { e.printStackTrace(); }
System.out.println( "INFO - End of `demo` method. " + Instant.now() );
}
class PrintUuid implements Runnable
{
@Override
public void run ( )
{
try { Thread.sleep( Duration.ofSeconds( 2 ).toMillis() ); } catch ( InterruptedException e ) { e.printStackTrace(); }
UUID uuid = UUID.randomUUID();
System.out.println( "uuid = " + uuid + " at " + Instant.now() + " by thread ID # " + Thread.currentThread().getId() );
}
}
}
作为调试的一部分,让该代码完全按照编写的方式在您的应用中运行。然后过渡到您的实际任务以同时运行。一切正常后,将代码移动到您的 JSP 中。
织机项目
Project Loom 将带来 Java 并发设施的创新。基于早期访问 Java 17 的实验性构建是 available now。
正在考虑的更改之一是使ExecutorService 接口AutoCloseable。这意味着我们可以使用try-with-resources 语法。只有在所有提交的任务都完成后,控制流才会通过try 块。
一个较小的变化是对 java.time 类的支持。这包括在休眠当前线程时使用Duration 替代int 毫秒计数。
package work.basil.example.simple;
import java.time.Duration;
import java.time.Instant;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class App
{
public static void main ( String[] args )
{
App app = new App();
app.demo();
}
private void demo ( )
{
System.out.println( "INFO - End of `demo` method. " + Instant.now() );
try (
ExecutorService executorService = Executors.newSingleThreadExecutor() ;
)
{
for ( int i = 0 ; i < 7 ; i++ )
{
executorService.submit( new PrintUuid() );
}
}
// At this point, flow-of-control blocks until all submitted tasks are done/canceled/failed.
// After this point, the executor service will have been automatically shutdown, wia `close` method called by try-with-resources syntax.
System.out.println( "INFO - End of `demo` method. " + Instant.now() );
}
class PrintUuid implements Runnable
{
@Override
public void run ( )
{
try { Thread.sleep( Duration.ofSeconds( 2 ) ); } catch ( InterruptedException e ) { e.printStackTrace(); }
UUID uuid = UUID.randomUUID();
System.out.println( "uuid = " + uuid + " at " + Instant.now() + " by thread ID # " + Thread.currentThread().getId() );
}
}
}