Java 使用线程同时运行两个独立的任务
我已经学习了很多关于java线程的教程,但是我找不到答案 我的问题是:如何同时运行两个独立的线程 我的情况是:我有两项任务Java 使用线程同时运行两个独立的任务,java,multithreading,threadpool,Java,Multithreading,Threadpool,我已经学习了很多关于java线程的教程,但是我找不到答案 我的问题是:如何同时运行两个独立的线程 我的情况是:我有两项任务 将一些数据保存到数据库中 在移动设备上发送推送通知 因为这两个任务是独立的,所以我想同时执行它们 我尝试使用带有两个线程的线程池,但问题是数据库任务完成得很快,但发送推送通知需要一些时间 因此,当一个任务完成而另一个任务仍挂起时,它会抛出异常 我的代码中也没有问题,因为它在不使用线程的情况下运行良好 提前谢谢 new Thread(new Runnable() {
new Thread(new Runnable() {
public void run() {
System.out.println("Look ma, no hands");
}
}).start();
new Thread(new Runnable() {
public void run() {
System.out.println("Look at me, look at me...");
}
}).start();
很好用
我更喜欢用私人的
使用Executor服务示例更新
所以我写了这个非常快速的例子
基本上,它使用一个ExecutorService
来运行几个简单的任务。目前,这两个任务将彼此并行运行(同时运行)
publicstaticvoidmain(String[]args)抛出InterruptedException{
ExecutorService=Executors.newFixedThreadPool(2);
提交(新的PathScanner());
提交(新计数器());
service.shutdown();
服务终止(1,时间单位:天);
系统出口(0);
}
公共静态类PathScanner实现可调用{
@凌驾
公共对象调用()引发异常{
扫描(新文件(“C:/”),0);
返回null;
}
受保护的无效扫描(文件路径,整数深度){
如果(深度<15){
System.out.println(“扫描”+路径+”,深度为“+深度);
File[]files=path.listFiles();
用于(文件:文件){
if(file.isDirectory()){
扫描(文件++深度);
}
}
}
}
}
公共静态类计数器实现可调用{
@凌驾
公共对象调用()引发异常{
对于(int-index=0;index<1000;index++){
睡眠(1);
系统输出打印项次(索引);
}
返回null;
}
}
运行它
现在更改ExecutorService=Executors.newFixedThreadPool(2)
toExecutorService=Executors.newFixedThreadPool(1)
并再次运行它。你看到区别了吗
这是控制执行器在处理其队列时可以同时使用的线程数的方法
再做一些任务,并将它们添加到队列中,看看您得到了什么。我有一个使用多线程在多个文件夹中搜索文件的用例。 作为输入,我只有根目录路径,并且可以有任意数量的子目录。 假设-文件将始终仅在其中一个子目录中可用
import java.io.File;
import java.io.FileFilter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SearchFile implements Runnable {
private String dirPath = null;
public SearchFile() {
}
public SearchFile(String dirPath) {
this.dirPath = dirPath;
}
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
File dir = new File("D://");
checkRootDirectory(dir);
long endTime = System.currentTimeMillis();
System.out.println("Time taken: "+(endTime - startTime) + "ms");
}
private static void checkRootDirectory(File root) {
File[] list = root.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory() && !pathname.isHidden();
}
});
ExecutorService service = Executors.newFixedThreadPool(list.length);
for (File directories : list) {
String dirPath = directories.getAbsolutePath();
Thread thread = new Thread(new SearchFile(dirPath));
service.execute(thread);
}
service.shutdown();
while(!service.isTerminated()) {
}
}
@Override
public void run() {
checkEachDirectory(new File(dirPath), "Temp.txt");
}
private void checkEachDirectory(File root, String fileName) {
File[] list = root.listFiles();
if (null != list) {
for (File dir : list) {
if (dir.isDirectory()) {
checkEachDirectory(dir, fileName);
} else if (fileName.equalsIgnoreCase(dir.getName())) {
System.out.println(
"Thread name: " + Thread.currentThread().getName() + " Founded @" + dir.getAbsolutePath());
}
}
}
}
}
它抛出一个异常,将异常发布到此处可能会很有用。任务是否与此相关?Ie您想在数据保存后发送通知吗??或者你只是想把一堆随机的任务排成一个队列???@MadProgrammer谢谢你的快速回复。数据库这两个任务彼此独立。因此,无论是先保存数据还是先发送推送通知,都无所谓。感谢您的快速响应和示例!回答接受!:-)是的,但是它给出了一个空引用异常。如果返回
null
,则应在哪一点使用Thread.getID?@MarlonAbeykoon,以确定是否存在错误或名称已手动设置。然而,假设你想知道哪个线程在做什么,你可以把它放在run
方法中…@MadProgrammer你能看看我的问题吗
import java.io.File;
import java.io.FileFilter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SearchFile implements Runnable {
private String dirPath = null;
public SearchFile() {
}
public SearchFile(String dirPath) {
this.dirPath = dirPath;
}
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
File dir = new File("D://");
checkRootDirectory(dir);
long endTime = System.currentTimeMillis();
System.out.println("Time taken: "+(endTime - startTime) + "ms");
}
private static void checkRootDirectory(File root) {
File[] list = root.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory() && !pathname.isHidden();
}
});
ExecutorService service = Executors.newFixedThreadPool(list.length);
for (File directories : list) {
String dirPath = directories.getAbsolutePath();
Thread thread = new Thread(new SearchFile(dirPath));
service.execute(thread);
}
service.shutdown();
while(!service.isTerminated()) {
}
}
@Override
public void run() {
checkEachDirectory(new File(dirPath), "Temp.txt");
}
private void checkEachDirectory(File root, String fileName) {
File[] list = root.listFiles();
if (null != list) {
for (File dir : list) {
if (dir.isDirectory()) {
checkEachDirectory(dir, fileName);
} else if (fileName.equalsIgnoreCase(dir.getName())) {
System.out.println(
"Thread name: " + Thread.currentThread().getName() + " Founded @" + dir.getAbsolutePath());
}
}
}
}
}