java多线程使用场景?

河西那头 2019-04-22 02:22:12
比如我现在有个需求,这有n个规则,规则执行是向数据库选择的表导入数据的,每个规则可能耗时较长,依次点击这个规则进行执行。
请问,这个时候需不需要用到线程?这样的n可以有多少个?
我测试了下,不用线程,执行也都没问题啊,用new Thread().start() 也没啥区别,所以不懂了,问下
...全文
2091 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianfang 2019-05-05
  • 打赏
  • 举报
回复
典型的并发场景 : 爬虫 web服务器,tomcat/jetty等都使用了多线程 业务处理不算,要并发写入单个数据库,并发多了以后,效率下降
河西那头 2019-04-29
  • 打赏
  • 举报
回复
引用 24 楼 许多年以后LP 的回复:
引用 23 楼 许多年以后LP 的回复:
了解以下乐观锁和悲观锁
而且不是线程越多越好,跟系统的cpu核数有关系
OK,谢了
许多年以后LP 2019-04-28
  • 打赏
  • 举报
回复
引用 23 楼 许多年以后LP 的回复:
了解以下乐观锁和悲观锁
而且不是线程越多越好,跟系统的cpu核数有关系
许多年以后LP 2019-04-28
  • 打赏
  • 举报
回复
了解以下乐观锁和悲观锁
北城落花雨 2019-04-26
  • 打赏
  • 举报
回复
我感觉这样写耗时长应该是正常的吧
luj_1768 2019-04-26
  • 打赏
  • 举报
回复
虚拟机能支持多线程吧?!
河西那头 2019-04-26
  • 打赏
  • 举报
回复
引用 21 楼 Dan淡淡的心 的回复:
不用连接池的话 jdbc 可以一个线程一个Connection,但是开多了会有问题,这个你自己把握吧,建议用连接池比较好
多线程加连接池。
线程池加jdbc连接池吗?好的,我试试,多谢啦
Dan淡淡的心 2019-04-26
  • 打赏
  • 举报
回复
不用连接池的话 jdbc 可以一个线程一个Connection,但是开多了会有问题,这个你自己把握吧,建议用连接池比较好 多线程加连接池。
Dan淡淡的心 2019-04-26
  • 打赏
  • 举报
回复
引用 18 楼 河西那头 的回复:
引用 15 楼 Dan淡淡的心 的回复:
确定你代码是这样写的话,那么首先任务过多的话采用线程池来操作,其次数据库连接使用多个连接,单个连接是线程安全的,如果使用了连接池的话,连接池大小 在8个左右,最后(其实我觉得不太可能),计算机是单核的话 线程是不会提高速度的。
也就依次执行了三个,那我试试线程池吧,正好没用过,可以试下。数据库连接池最后再试试,因为我查询是从不同数据库,插入是同个数据库
我自己测试了一次 主要是连接的问题 单个连接是线程安全的 所以 多线程并不能加快执行速度 千军万马过独木桥的感觉 ,虽然开了很多线程 但是 桥还是只有一个,所以还是单线程的速度,但是开启线程需要资源的,反而会更慢。多几个连接就好了
河西那头 2019-04-26
  • 打赏
  • 举报
回复
引用 16 楼 北城落花雨 的回复:
我感觉这样写耗时长应该是正常的吧
所以我想问应该怎么写合适
河西那头 2019-04-26
  • 打赏
  • 举报
回复
引用 15 楼 Dan淡淡的心 的回复:
确定你代码是这样写的话,那么首先任务过多的话采用线程池来操作,其次数据库连接使用多个连接,单个连接是线程安全的,如果使用了连接池的话,连接池大小 在8个左右,最后(其实我觉得不太可能),计算机是单核的话 线程是不会提高速度的。
也就依次执行了三个,那我试试线程池吧,正好没用过,可以试下。数据库连接池最后再试试,因为我查询是从不同数据库,插入是同个数据库
Dan淡淡的心 2019-04-25
  • 打赏
  • 举报
回复
确定你代码是这样写的话,那么首先任务过多的话采用线程池来操作,其次数据库连接使用多个连接,单个连接是线程安全的,如果使用了连接池的话,连接池大小 在8个左右,最后(其实我觉得不太可能),计算机是单核的话 线程是不会提高速度的。
Dan淡淡的心 2019-04-24
  • 打赏
  • 举报
回复
引用 10 楼 河西那头 的回复:
[quote=引用 4 楼 Dan淡淡的心 的回复:] 假设你每个规则用时都是1h,有10个规则, 那么你单线程执行就是 1->2->3->。。。->9->10;//用时10h 多线程执行,每个线程执行一个规则,每个线程 用时1h,因为同步执行所以项目总用时1h;
这个我清楚,我现在就想达到这种效果,但我只用了最简单的,把这段操作代码加入到线程,依次执行后,耗时更长了。。这样做是否不对?还是需要更深入了解多线程[/quote] 这样做当然是不对的 既然要分开执行 那么 那部分代码就要拆分出来(或者改变参数,最终让执行部分为n) 例如

int n = 10;
for(int i=0;i<n;i++){
    System.out.println(n*n);//假设这行代码执行时间为1h,那么我整个程序执行下来就要10h
}


public class Tests extends Thread{
	
	
	public static void main(String[] args) throws IOException {
		int n = 10;
		for(int i=0;i<n;i++) {
			new Tests(i).start();//启动线程时间忽略不计  那么总共用时1h
		}
	}
	private int n;
	
	public Tests(int n) {
		this.n = n;
	}
	
	@Override
	public void run() {
		System.out.println(n*n);
	}
	
}


静看星辰变 2019-04-24
  • 打赏
  • 举报
回复
引用 9 楼 河西那头的回复:
[quote=引用 8 楼 像风一样666 的回复:]
[quote=引用 6 楼 河西那头的回复:][quote=引用 2 楼 像风一样666 的回复:]
一个效率的问题。依次点击来执行是串行执行,只有上一个任务或线程执行完了才能开启下一个任务或线程。而对数据库的操作是有IO操作的,在进行IO操作时cpu会等待当前线程的IO操作结束后才会继续执行当前线程的后续操作,效率很低。但如果你为每一个数据库操作都分配一个单独的线程去执行,那么在一个线程因IO操作进入阻塞时,cpu可以执行其他的线程,等之前线程IO结束后又继续执行之前的线程,效率会提高很多。
使用场景的话,遍地都是吧,比如数据库连接池,比如典型的抢票实现等。现在基本不用自己写多线程的代码,都是使用别人写好的框架或者工具类。
现在就是串行,我单独执行其中一个10几秒,现在我把它加入到线程,执行1后再去执行2再去执行3的时候,耗时比3个十几秒更长,请问这如何处理?[/quote]
这个要具体问题具体分析的,创建线程和销毁线程也是要时间和开销的。如果你每个线程在很短的时间内就结束了,并且没有涉及到一些让CPU阻塞的操作,可能创行的效率就比并发的效率要高。当并发的数量越大,并发的效率与串行之间的效率就越明显。[/quote]我这没什么逻辑啊,就几个操作(往数据库不同表导数据)需要一个一个执行一下,就最简单的加入线程,请问是我这样写不行,那该怎么测试?[/quote] 讲道理是这样写的,如果效果不明显的话,你增加数据库操作的次数试试。比如1000次,用个循环
河西那头 2019-04-24
  • 打赏
  • 举报
回复
引用 12 楼 Dan淡淡的心 的回复:
[quote=引用 10 楼 河西那头 的回复:]
[quote=引用 4 楼 Dan淡淡的心 的回复:]
假设你每个规则用时都是1h,有10个规则,
那么你单线程执行就是 1->2->3->。。。->9->10;//用时10h
多线程执行,每个线程执行一个规则,每个线程 用时1h,因为同步执行所以项目总用时1h;
这个我清楚,我现在就想达到这种效果,但我只用了最简单的,把这段操作代码加入到线程,依次执行后,耗时更长了。。这样做是否不对?还是需要更深入了解多线程[/quote]
这样做当然是不对的
既然要分开执行 那么 那部分代码就要拆分出来(或者改变参数,最终让执行部分为n)

例如

int n = 10;
for(int i=0;i<n;i++){
System.out.println(n*n);//假设这行代码执行时间为1h,那么我整个程序执行下来就要10h
}



public class Tests extends Thread{


public static void main(String[] args) throws IOException {
int n = 10;
for(int i=0;i<n;i++) {
new Tests(i).start();//启动线程时间忽略不计 那么总共用时1h
}
}
private int n;

public Tests(int n) {
this.n = n;
}

@Override
public void run() {
System.out.println(n*n);
}

}


[/quote]这个我清除,我现在是每点执行一次,它就启动一个线程,跟你这个应该一样吧?但是这样,耗时比单个执行完依次点击慢好多
Dan淡淡的心 2019-04-23
  • 打赏
  • 举报
回复
假设你每个规则用时都是1h,有10个规则, 那么你单线程执行就是 1->2->3->。。。->9->10;//用时10h 多线程执行,每个线程执行一个规则,每个线程 用时1h,因为同步执行所以项目总用时1h;
勇敢牛牛_ 2019-04-23
  • 打赏
  • 举报
回复
看你的n个操作是否是串行操作,也就是说后一步的操作是否依赖前一步的结果,若是,则无法使用多线程,若不是,则可用。
静看星辰变 2019-04-23
  • 打赏
  • 举报
回复
一个效率的问题。依次点击来执行是串行执行,只有上一个任务或线程执行完了才能开启下一个任务或线程。而对数据库的操作是有IO操作的,在进行IO操作时cpu会等待当前线程的IO操作结束后才会继续执行当前线程的后续操作,效率很低。但如果你为每一个数据库操作都分配一个单独的线程去执行,那么在一个线程因IO操作进入阻塞时,cpu可以执行其他的线程,等之前线程IO结束后又继续执行之前的线程,效率会提高很多。 使用场景的话,遍地都是吧,比如数据库连接池,比如典型的抢票实现等。现在基本不用自己写多线程的代码,都是使用别人写好的框架或者工具类。
河西那头 2019-04-23
  • 打赏
  • 举报
回复
引用 4 楼 Dan淡淡的心 的回复:
假设你每个规则用时都是1h,有10个规则,
那么你单线程执行就是 1->2->3->。。。->9->10;//用时10h
多线程执行,每个线程执行一个规则,每个线程 用时1h,因为同步执行所以项目总用时1h;
这个我清楚,我现在就想达到这种效果,但我只用了最简单的,把这段操作代码加入到线程,依次执行后,耗时更长了。。这样做是否不对?还是需要更深入了解多线程
河西那头 2019-04-23
  • 打赏
  • 举报
回复
引用 8 楼 像风一样666 的回复:
[quote=引用 6 楼 河西那头的回复:][quote=引用 2 楼 像风一样666 的回复:]
一个效率的问题。依次点击来执行是串行执行,只有上一个任务或线程执行完了才能开启下一个任务或线程。而对数据库的操作是有IO操作的,在进行IO操作时cpu会等待当前线程的IO操作结束后才会继续执行当前线程的后续操作,效率很低。但如果你为每一个数据库操作都分配一个单独的线程去执行,那么在一个线程因IO操作进入阻塞时,cpu可以执行其他的线程,等之前线程IO结束后又继续执行之前的线程,效率会提高很多。
使用场景的话,遍地都是吧,比如数据库连接池,比如典型的抢票实现等。现在基本不用自己写多线程的代码,都是使用别人写好的框架或者工具类。
现在就是串行,我单独执行其中一个10几秒,现在我把它加入到线程,执行1后再去执行2再去执行3的时候,耗时比3个十几秒更长,请问这如何处理?[/quote]
这个要具体问题具体分析的,创建线程和销毁线程也是要时间和开销的。如果你每个线程在很短的时间内就结束了,并且没有涉及到一些让CPU阻塞的操作,可能创行的效率就比并发的效率要高。当并发的数量越大,并发的效率与串行之间的效率就越明显。[/quote]我这没什么逻辑啊,就几个操作(往数据库不同表导数据)需要一个一个执行一下,就最简单的加入线程,请问是我这样写不行,那该怎么测试?
加载更多回复(5)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧