java多进程
进程和线程的概念
什么是进程
一个进程就是在一个运行的程序 它有自己独立的内存空间 一组系统资源 每个进程的内部数据和状态都是独立的 例如在window是同时打开多个记事本 虽然它们所运行的程序代码都是一样的 但是所使用的内存空间是独立的 互不干扰
什么是线程
线程与进程相似 是一段完成某个特定功能的代码 是程序中单个顺序的流控制;但与进程不同的是 同类的多个线程共享一块内存空间和一组系统资源 而线程本身的数据通常只有微处理器的寄存器数据 以及一个供程序执行时使用的堆栈
进程与线程的区别
进程:每个进程都有独立的代码和数据空间(进程上下文) 进程切换的开销大
线程:轻量的进程 同一类线程共享代码和数据空间 每个线程有独立的运行栈和程序计数器(PC) 线程切换的开销小
多进程:在操作系统中 能同时运行多个任务程序
多线程:在同一应用程序中 有多个顺序流同时执行
线程创竖态梁建的两种方式
采用继承Thread类创建线程
该方法比较简单 主要是通过继承java lang Thread类 并覆盖Thread类的run()方法来完成线成的创建 Thread 类是一个具体的闭悄类 即不是抽象类 该类封装了线程的行为 要创建一个线程 程序员必须创建一个从 Thread 类导出的新类 Thread类中有两个最重要的函数run()和start()
通过实现Runnable接口创建线程
该方法通过生成实现java lang Runnable接口的类 该接口只定义了一个方法run() 所以必须余运在新类中实现它 但是 Runnable 接口并没有任何对线程的支持 我们还必须创建 Thread 类的实例 这一点通过 Thread 类的构造函数
public Thread(Runnable target);来实现
单线程和多线程性能比较
以使用蒙特卡罗概率算法求π为例 进行单线程和多线程时间比较
什么是蒙特卡罗概率算法
蒙特卡罗法(Monte Carlo method)是以概率和统计的理论 方法为基础的一种计算方法 将所求解的问题同一定的概率模型相联系 用电子计算机实现统计模拟或抽样 以获得问题的近似解 故又称统计模拟法或统计试验法 网络
蒙特卡罗求算法求π
第一步
画正方形和内切圆
第二步
变换表达式
正方形面积As=( R)^
圆的面积Ac=πR^
Ac/As=( R)^ /πR^
π= As/Ac
令P=As/Sc 则π= P
第三步
重复N次实验求平均值
在正方形区域内随机生成一个点A 若A落在圆区域内 M++
P=M/N
π= P N的取值越大 π的值越精确
java代码实现算法
N取值为 万 多线程的数为 每个线程执行 万次模拟实验
线程实现
import ncurrent CountDownLatch;
public class ProModel implements Runnable {
public int N;//随机实验的总次数
public static int M;//随机点落在圆中的次数
private int id;
private final CountDownLatch doneSignal;
OBJ semaphore;
public ProModel(int id CountDownLatch doneSignal int N OBJ semaphore ){
this id=id;
this doneSignal=doneSignal;
this N=N;
this semaphore=semaphore ;
M= ;
}
public void run(){
int tempM= ;
for(int i= ;i<N;i++){
if(isInCircle()){
tempM++;
}
}
synchronized (semaphore) {
add(tempM);
}
untDown();//使end状态减
}
public void add(int tempM){
System out println(Thread currentThread() getName());
M=M+tempM;
System out println(M);
}
//随机产生一个在正方形区域的点 判断它是否在圆中
public boolean isInCircle(){
double x=Math random();
double y=Math random();
if((x )*(x )+(y )*(y )< )
return true;
else
return false;
}
public static int getTotal(){
return M;
}
}
多线程Main实现
import ncurrent CountDownLatch;
import ncurrent ExecutorService;
import ncurrent Executors;
public class MutliThread {
public static void main(String[] args) throws InterruptedException {
long begin=System currentTimeMillis();
int threadSize= ;
int N= ;
OBJ semaphore = new OBJ();
CountDownLatch doneSignal = new CountDownLatch(threadSize);
ProModel[] pros=new ProModel[threadSize];
//设置特定的线程池 大小为threadSizde
System out println( begins! );
ExecutorService exe = Executors newFixedThreadPool(threadSize);
for(int i= ;i<threadSize;i++)
exe execute(new ProModel(i+ doneSignal N semaphore));
try{
doneSignal await(); //等待end状态变为 }catch (InterruptedException e) {
// TODO: handle exception
e printStackTrace();
}finally{
System out println( ends! );
System out println( *(float)ProModel getTotal()/(float)(threadSize*N));
}
exe shutdown();
long end=System currentTimeMillis();
System out println( used time(ms): +(end begin));
}
}
class OBJ{}
单线程Main实现
import ncurrent CountDownLatch;
import ncurrent ExecutorService;
import ncurrent Executors;
public class SingleThread {
public static void main(String[] args) {
long begin=System currentTimeMillis();
int threadSize= ;
int N= ;
OBJ semaphore = new OBJ();
CountDownLatch doneSignal = new CountDownLatch(threadSize);
ProModel[] pros=new ProModel[threadSize];
//设置特定的线程池 大小为
System out println( begins! );
ExecutorService exe = Executors newFixedThreadPool(threadSize);
for(int i= ;i<threadSize;i++)
exe execute(new ProModel(i+ doneSignal N semaphore));
try{
doneSignal await(); //等待end状态变为 }catch (InterruptedException e) {
// TODO: handle exception
e printStackTrace();
}finally{
System out println( ends! );
System out println( *(float)ProModel getTotal()/(float)(threadSize*N));
}
exe shutdown();
long end=System currentTimeMillis();
System out println( used time(ms): +(end begin));
}
}
运行结果比较
lishixin/Article/program/Java/gj/201311/27648
㈡ php和java的主要区别有哪些
PHP和Java的主要区别包括以下几点:
运行机制:
库函数实现:
- PHP:库函数多用C实现。
- Java:核心类库用Java编写,应用运行时需解释执行用户代码及类库。
模板引擎与内置功能:
并发实现:
- PHP:PHPFPM采用多进程架构,支持进程池隔离,也能支持多线程模式。
- Java:依赖多线程实现并发。
内存管理:
- PHP:PHPFPM与Apache MOD_PHP常驻内存,资源释放彻底,内存管理由系统自动处理,PHPFPM能够自动管理崩溃的worker进程。
- Java:多线程编程需要开发者参与错误处理,否则可能导致JVM崩溃。
部署与热部署:
- PHP:支持热部署,依赖FTP上传即可实现代码更新。
- Java:实现热部署较困难。
数据共享与持久连接:
- PHP:天然支持跨进程数据共享,通过session、Yac或SQLite实现。支持持久连接,多个请求可以复用一个数据库连接。
- Java:程序共享数据依赖JVM内存。
开发框架与应用类型:
- PHP:更侧重于快速开发框架,适合开发I/O密集型应用。
- Java:提供更完整的类库与面向对象编程支持,在计算密集型应用上具有优势。
SAPI类型与并发管理:
- PHP:支持多种SAPI,提供丰富的并发与内存管理选项,可满足不同应用场景需求。
这些区别使得PHP和Java在各自擅长的领域里都有广泛的应用。PHP以其快速开发和灵活性在Web开发领域占据一席之地,而Java则以其强大的企业级特性和面向对象编程支持在计算密集型应用及大型系统中表现出色。
㈢ python代码for循环部分,可以做出想java一样多进程的呢,因为数据量比较大,跑的时间有点长了
frommultiprocessingimportPool
fp2=open("C:\b.csv",'w')
fp2.write('ab'' ')
defprocess_line(line):
line=line.rstrip().lstrip('"').rstrip('"')
print("checkingMD5"+line)
return_code=getResult(line)
ifreturn_code==1:
fp2.write(line+' ')
if__name__=="__main__":
pool=Pool(4)
withopen('C:\a.txt')assource_file:
#
pool.map(process_line,source_file,4)
试试这个。
㈣ php和java的主要区别有哪些
PHP与Java的主要区别体现在运行机制、库函数实现、模板引擎、数据库支持、并发实现、内存管理、部署方式、数据共享与持久连接、开发框架、大型应用支持、热部署、数据库访问速度、持久连接设置、进程间数据共享、GC机制与内存管理、SAPI类型、HTTP服务器功能、JIT支持与应用优化、并发性能、内存占用与稳定性、部署便利性、对象编程方式、大型应用适应性与性能需求。
PHP具有opcache机制,能够缓存opcode,支持JIT编译优化。Java则在运行时通过解释执行,使用HotSpot机制进行JIT编译,以提高性能。PHP的库函数多用C实现,Java的核心类库用Java编写,应用运行时需解释执行用户代码及类库。
PHP自带模板引擎,而Java Web开发通常需要JSP容器或第三方模板引擎。PHP内置HTTP服务器和SQLite数据库,而Java Web开发则多依赖第三方Servlet容器如Tomcat。
PHP-FPM采用多进程架构,支持进程池隔离,PHP-FPM与Nginx类似,能够有效利用多核并发处理。Java则依赖多线程实现并发。PHP支持多线程模式,如Apache的event MPM和Facebook的HHVM。
PHP-FPM与Apache MOD_PHP常驻内存,资源释放彻底,内存管理由系统自动处理,PHP-FPM能够自动管理崩溃的worker进程。Java多线程编程需要开发者参与错误处理,否则可能导致JVM崩溃。
PHP支持热部署,依赖FTP上传即可实现代码更新,而Java实现热部署较困难。PHP天然支持跨进程数据共享,通过session、Yac或SQLite实现。Java程序共享数据依赖JVM内存。
PHP的数据库驱动如mysqlnd等性能与Java的JDBC驱动相当,支持持久连接,多个请求复用一个连接,无需频繁打开数据库连接。PHP与Java性能相当,适用于大多数Web应用,尤其是I/O密集型应用。
PHP与Java共同诞生于1995年,两者功能与特点各具优势。PHP更侧重于快速开发框架,Java则提供更完整的类库与面向对象编程支持。PHP适合开发I/O密集型应用,Java在计算密集型应用上具有优势。
PHP支持多种SAPI,如php-cgi、php-fpm/hhvm、libphp7.so等,提供丰富的并发与内存管理选项,可满足不同应用场景需求。PHP-FPM与Apache MOD_PHP的常驻内存与资源管理机制确保了高效稳定的服务运行。
JIT(即时编译)机制在计算密集型应用中表现出色,但Web应用多为I/O密集型,编译型语言的性能优势在此类应用中并不显着。PHP-FPM的内存占用与稳定性在实际应用中得到了验证,支持持久连接的配置,无需额外依赖。