返回首页

关于java服务器并发处理

85 2024-03-26 19:43 admin

一、关于java服务器并发处理

我来告诉你吧,如果你用J2EE的话,现在所有的java的web容器,如weblogic、tomcat等其中都有一个servlet的java应用程序,在web服务器启动的时候就会加载它,这个应用程序就处理你的http数据请求了,而servlet本身就是实现了多线程,所以所有的请求处理你都可以看作是多线程的,不用你去管的,建议你看一下servlet的请求处理机制和生命周期。

另外一种就是你说的用socket了,首先你需要一个服务器,在java中使用SocketServer来创建的,这样会绑定一个端口来监听客户端发来的消息,按你说的每个消息都新创建一个线程来处理,如果有成千上万的消息难道你每个都新启一个线程来处理?显然是不可能的,这里就要用到线程池了哈,简单说就是把比如说100个线程放到一个池中,如果消息进来了首先去找这个池中的空闲线程,找到了就用这个线程处理,处理完了就让这个线程空闲等待下一任务。如果没有空闲线程就等待。所以这样重复利用线程就可以完全达到你的目的了。

二、为什么要学习 Java 并发编程

1. 提高计算效率,充分利用计算机性能。

2. 为大数据处理做好准备。

三、java fork join和thread的区别

Java并发编程的4种风格:Threads,Executors,ForkJoin和Actors

我们生活在一个事情并行发生的世界。自然地,我们编写的程序也反映了这个特点,它们可以并发的执行。当然除了Python代码(译者注:链接里面讲述了Python的全局解释器锁,解释了原因),不过你仍然可以使用Jython在JVM上运行你的程序,来利用多处理器电脑的强大能力。

然而,并发程序的复杂程度远远超出了人类大脑的处理能力。相比较而言,我们简直弱爆了:我们生来就不是为了思考多线程程序、评估并发访问有限资源以及预测哪里会发生错误或者瓶颈。

面对这些困难,人类已经总结了不少并发计算的解决方案和模型。这些模型强调问题的不同部分,当我们实现并行计算时,可以根据问题做出不同的选择。

在这篇文章中,我将会用对同一个问题,用不同的代码来实现并发的解决方案;然后讨论这些方案有哪些好的地方,有哪些缺陷,可能会有什么样的陷阱在等着你。

我们将介绍下面几种并发处理和异步代码的方式:

• 裸线程

• Executors和Services

• ForkJoin框架和并行流

• Actor模型

为了更加有趣一些,我没有仅仅通过一些代码来说明这些方法,而是使用了一个共同的任务,因此每一节中的代码差不多都是等价的。另外,这些代码仅仅是展示用的,初始化的代码并没有写出来,并且它们也不是产品级的软件示例。

对了,最后一件事:在文章最后,有一个小调查,关于你或者你的组织正在使用哪种并发模式。为了你的工程师同胞们,请填一下调查!

任务

任务:实现一个方法,它接收一条消息和一组字符串作为参数,这些字符串与某个搜索引擎的查询页面对应。对每个字符串,这个方法发出一个http请求来查询消息,并返回第一条可用的结果,越快越好。

如果有错误发生,抛出一个异常或者返回空都是可以的。我只是尝试避免为了等待结果而出现无限循环。

简单说明:这次我不会真正深入到多线程如何通讯的细节,或者深入到Java内存模型。如果你迫切地想了解这些,你可以看我前面的文章利用JCStress测试并发。

那么,让我们从最直接、最核心的方式来在JVM上实现并发:手动管理裸线程。

方法1:使用“原汁原味”的裸线程

解放你的代码,回归自然,使用裸线程!线程是并发最基本的单元。Java线程本质上被映射到操作系统线程,并且每个线程对象对应着一个计算机底层线程。

自然地,JVM管理着线程的生存期,而且只要你不需要线程间通讯,你也不需要关注线程调度。

每个线程有自己的栈空间,它占用了JVM进程空间的指定一部分。

线程的接口相当简明,你只需要提供一个Runnable,调用.start()开始计算。没有现成的API来结束线程,你需要自己来实现,通过类似boolean类型的标记来通讯。

四、java 并发操作

在你的方法加上synchronized  可以避免这种问题的发生 

五、java (线程的同步与并发)

试试我改过的这个

class Mystack

{

int index=0;

private char[]date=new char [10];

public void push(char c)

{

synchronized(this)

{

if(index<10)

{

date[index]=c;

index++;

if(index==10)

notify();

}

else

{

try

{

System.out.println (push wait);

wait();

}

catch(Exception e)

{

e.printStackTrace();

System.err.println(e);

}

}

}

}

public void pop()

{

synchronized(this)

{

if(index!=0)

{

if(index>9)

index--;

System.out.print (B:pop);

System.out.println (date[index]);

index--;

if(index==0)

notify();

}

else

{

try

{

System.out.println (pop wait);

wait();

}

catch(Exception e)

{

e.printStackTrace();

System.err.println (e);

}

}

}

}

}

class PushChar extends Thread

{

Mystack s;

char c;

PushChar(Mystack s)

{

this.s=s;

}

public void run()

{

System.out.println (start push);

for (int i=0; i<20; i++)

{

c=(char)(Math.random()*26+'A');

s.push(c);

System.out.println(A:push +c);

}

}

}

class PopChar extends Thread

{

Mystack s;

char c;

PopChar(Mystack s)

{

this.s=s;

}

public void run()

{

System.out.println (start pop);

for(int j=0;j<20;j++)

s.pop();

}

}

public class Test

{

public static void main (String[] args)

{

Mystack s=new Mystack();

PushChar a=new PushChar(s);

PopChar b=new PopChar(s);

a.start();

b.start();

}

}

顶一下
(0)
0%
踩一下
(0)
0%
相关评论
我要评论
用户名: 验证码:点击我更换图片