java如何多线程并发执行?

java如何多线程并发执行?,第1张

把对这个list的check行为放到一个多线程里面去做这样当执行这个方法的时候程序就会立刻返回,也就可以去处理其他事情了线程会在后台执行
不要把每个check都用一个线程,这样的并发问题,是非常复杂
public void method(){
Thread t = new Thread() {
@Override
public void run() {
//dosomething
//线程在后台执行你想执行的东西
}
};
tstart();
//该方法执行后,立刻返回,让程序得意执行其他 *** 作
}

进程间的通讯无非就是读写文件,socket通讯或者使用共享内存。 你不想用读写文件的方式,那就用共享内存或者socket通讯的方式。我个人觉得用socket比较简单,也许是因为我对socket比较熟悉。 下面是一篇java实现共享内存的文章,java没法管理内存,其实他也是靠创建映像文件来实现的。 共享内存在java中的实现 在jdk14中提供的类MappedByteBuffer为我们实现共享内存提供了较好的方法。该缓冲区实际上是一个磁盘文件的内存映像。二者的变化将保持同步,即内存数据发生变化会立刻反映到磁盘文件中,这样会有效的保证共享内存的实现。 将共享内存和磁盘文件建立联系的是文件通道类:FileChannel。该类的加入是JDK为了统一对外部设备(文件、网络接口等)的访问方法,并且加强了多线程对同一文件进行存取的安全性。例如读写 *** 作统一成read和write。这里只是用它来建立共享内存用,它建立了共享内存和磁盘文件之间的一个通道。 打开一个文件建立一个文件通道可以用RandomAccessFile类中的方法getChannel。该方法将直接返回一个文件通道。该文件通道由于对应的文件设为随机存取文件,一方面可以进行读写两种 *** 作,另一方面使用它不会破坏映像文件的内容(如果用FileOutputStream直接打开一个映像文件会将该文件的大小置为0,当然数据会全部丢失)。这里,如果用 FileOutputStream和FileInputStream则不能理想的实现共享内存的要求,因为这两个类同时实现自由的读写 *** 作要困难得多。 下面的代码实现了如上功能,它的作用类似UNIX系统中的mmap函数。 // 获得一个只读的随机存取文件对象 RandomAccessFile RAFile = new RandomAccessFile(filename,"r"); // 获得相应的文件通道 FileChannel fc = RAFilegetChannel(); // 取得文件的实际大小,以便映像到共享内存 int size = (int)fcsize(); // 获得共享内存缓冲区,该共享内存只读 MappedByteBuffer mapBuf = fcmap(FileChannelMAP_RO,0,size); // 获得一个可读写的随机存取文件对象 RAFile = new RandomAccessFile(filename,"rw"); // 获得相应的文件通道 fc = RAFilegetChannel(); // 取得文件的实际大小,以便映像到共享内存 size = (int)fcsize(); // 获得共享内存缓冲区,该共享内存可读写 mapBuf = fcmap(FileChannelMAP_RW,0,size); // 获取头部消息:存取权限 mode = mapBufgetInt(); 如果多个应用映像同一文件名的共享内存,则意味着这多个应用共享了同一内存数据。这些应用对于文件可以具有同等存取权限,一个应用对数据的刷新会更新到多个应用中。 为了防止多个应用同时对共享内存进行写 *** 作,可以在该共享内存的头部信息加入写 *** 作标志。该共享内存的头部基本信息至少有: int Length; // 共享内存的长度。 int mode; // 该共享内存目前的存取模式。 共享内存的头部信息是类的私有信息,在多个应用可以对同一共享内存执行写 *** 作时,开始执行写 *** 作和结束写 *** 作时,需调用如下方法: public boolean StartWrite() { if(mode == 0) { // 标志为0,则表示可写 mode = 1; // 置标志为1,意味着别的应用不可写该共享内存 mapBufflip(); mapBufputInt(mode); // 写如共享内存的头部信息 return true; } else { return false; // 指明已经有应用在写该共享内存,本应用不可写该共享内存 } } public boolean StopWrite() { mode = 0; // 释放写权限 mapBufflip(); mapBufputInt(mode);

如果需要使 Map 线程安全,大致有这么四种方法:
1、使用 synchronized 关键字,代码如下
synchronized(anObject) {
value = mapget(key);
}
2、使用 JDK15提供的锁(JavautilconcurrentlocksLock)。代码如下
locklock();
value = mapget(key);
lockunlock();
3、使用 JDK15 提供的读写锁(javautilconcurrentlocksReadWriteLock)。代码如下
rwlockreadLock()lock();
value = mapget(key);
rwlockreadLock()unlock();
这样两个读 *** 作可以同时进行,理论上效率会比方法 2 高。
4、使用 JDK15 提供的 javautilconcurrentConcurrentHashMap 类。该类将 Map 的存储空间分为若干块,每块拥有自己的锁,大大减少了多个线程争夺同一个锁的情况。代码如下
value = mapget(key); //同步机制内置在 get 方法中
其中ConcurrentHashMap是最好最快的

你指的高并发量大概有多少?\x0d\几点需要注意:\x0d\尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与数据库的交互,提高性能。\x0d\用jprofiler等工具找出性能瓶颈,减少额外的开销。\x0d\优化数据库查询语句,减少直接使用hibernate等工具的直接生成语句(仅耗时较长的查询做优化)。\x0d\优化数据库结构,多做索引,提高查询效率。\x0d\统计的功能尽量做缓存,或按每天一统计或定时统计相关报表,避免需要时进行统计的功能。\x0d\\x0d\能使用静态页面的地方尽量使用,减少容器的解析(尽量将动态内容生成静态html来显示)。\x0d\解决以上问题后,使用服务器集群来解决单台的瓶颈问题。\x0d\基本上以上述问题解决后,达到系统最优。\x0d\\x0d\至于楼上有人提到别用JAVA来做,除非是低层的连接数过大(如大量的端口占用需求),这种情况下考虑直接C来写,其他的可以用JAVA来做。\x0d\\x0d\可以网上购买视频做教育学习。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13379015.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-24
下一篇 2023-07-24

发表评论

登录后才能评论

评论列表(0条)

保存