Java 并行四任务执行
我想用四个线程独立地并行执行四个任务。我想减少执行时间。但是这个程序不能减少执行时间。在这个程序中,顺序执行时间小于并行执行时间。我想从顺序执行中更快地执行程序。如何并行执行四个任务并减少执行时间。请删除此代码的问题并给出解决方案Java 并行四任务执行,java,parallel-processing,aes,executorservice,Java,Parallel Processing,Aes,Executorservice,我想用四个线程独立地并行执行四个任务。我想减少执行时间。但是这个程序不能减少执行时间。在这个程序中,顺序执行时间小于并行执行时间。我想从顺序执行中更快地执行程序。如何并行执行四个任务并减少执行时间。请删除此代码的问题并给出解决方案 package TestParallel; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectOutp
package TestParallel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
/**
*
* @author Sohel Rana
*/
public class Executor {
public void encrypt(File fname) throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); //using AES-256
SecretKey key = keyGen.generateKey(); //generating key
// System.out.println("Key = " + bytesToHex(key.getEncoded()));
Cipher aesCipher = Cipher.getInstance("AES"); //getting cipher for AES
aesCipher.init(Cipher.ENCRYPT_MODE, key); //initializing cipher for encryption with key
//creating file output stream to write to file
try (FileOutputStream fos = new FileOutputStream(fname + ".aes")) {
//creating object output stream to write objects to file
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(key); //saving key to file for use during decryption
//creating file input stream to read contents for encryption
try (FileInputStream fis = new FileInputStream(fname)) {
//creating cipher output stream to write encrypted contents
try (CipherOutputStream cos = new CipherOutputStream(fos, aesCipher)) {
int read;
byte buf[] = new byte[4096];
while ((read = fis.read(buf)) != -1) //reading from file
{
cos.write(buf, 0, read); //encrypting and writing to file
}
}
}
// fname.delete();
}
}
public static void main(final String[] args) throws InterruptedException {
final ExecutorService pool = Executors.newFixedThreadPool(4);
File file1 = new File("C:\\Users\\Sohel Rana\\Desktop\\test\\33 - Overflow Menu.mp4");
File file2 = new File("C:\\Users\\Sohel Rana\\Desktop\\test\\Java Cryptography Tutorials 1 AES Encryption and Decryption using Java.mp4");
File file3 = new File("C:\\Users\\Sohel Rana\\Desktop\\test\\30 - Dank Meme Bro.mp4");
File file4 = new File("C:\\Users\\Sohel Rana\\Desktop\\test\\How to change API level Android Studio.mp4");
Executor ex = new Executor();
long startTime = System.currentTimeMillis();
pool.execute(() -> {
try {
ex.encrypt(file1);
ex.encrypt(file2);
ex.encrypt(file3);
ex.encrypt(file4);
} catch (Exception ex1) {
Logger.getLogger(Executor.class.getName()).log(Level.SEVERE, null, ex1);
}
});
pool.shutdown();
if (!pool.awaitTermination(1, TimeUnit.DAYS)) {
System.err.println("Pool did not terminate.");
}
long endTime = System.currentTimeMillis();
System.out.println("Paralle took time " + (endTime - startTime)
+ " milliseconds.");
}
}
这是创建一个
Runnable
,它一个接一个地运行单个encrypt
s
pool.execute(() -> {
try {
ex.encrypt(file1);
ex.encrypt(file2);
ex.encrypt(file3);
ex.encrypt(file4);
} catch (Exception ex1) {
Logger.getLogger(Executor.class.getName()).log(Level.SEVERE, null, ex1);
}
});
你需要做的是
for (File f : new File[] { file1, file2, file3, file4}) {
pool.execute(() -> {
try {
ex.encrypt(f);
} catch (Exception ex1) {
Logger.getLogger(Executor.class.getName()).log(Level.SEVERE, null, ex1);
}
});
}
作为补充说明,等待线程完成的方式之所以有效,是因为线程池的大小足以启动所有提交的任务。如果您要扩展此解决方案以添加更多文件,则这些文件可能永远不会被编码,因为执行器已将它们放入队列中,但尚未启动;这意味着它们根本不会启动,因为这是在
ExecutorService
上调用shutdown
的影响之一。您提交了一个加密四个文件的任务,不是四个任务加密一个文件。先生这个程序是对的吗?请确认先生。我怎样才能四个任务提交四个文件并行加密我想并行运行所有文件而不是顺序运行…请帮助并行执行所有文件并减少执行time@Sohel任务按顺序提交给executor服务,但是它们是并行执行的。我怎样才能并行提交所有任务并并行执行呢?你可以创建另一个线程池,启动四个线程,它们都等待一个信号,然后主线程发出信号,所有四个线程都希望并行提交主任务。这显然是无谓的努力浪费;打印循环开始时的时间,毫无疑问,您将看到每个任务提交之间的间隔不到一毫秒。@Sohel“并行提交”完全没有意义。首先,提交它们只需要一毫秒,所以它不会从并发性中获得任何好处。此外,您提交到的ExecutorService
将需要保护并发提交到达的关键部分,这将导致端点仍然是连续的。它只是在毫无意义地并行化一些需要正确顺序化的工作。