导航:首页 > 编程语言 > java多进程编程

java多进程编程

发布时间:2024-11-19 09:34:14

java单多线程求pair值算法比较

进程和线程的概念

什么是进程

一个进程就是在一个运行的程序 它有自己独立的内存空间 一组系统资源 每个进程的内部数据和状态都是独立的 例如在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

⑵ 学安卓开发的话难不难和java比哪个好学

阅读进阶书籍,阅读Android源码,阅读官方文档并尝试自己写相关的技术文章,需要有一定技术深度和自我思考。在这个阶段的学习过程中,有2个点是比较困扰大家的,一个是阅读源码,另一个是自定义View以及滑动冲突。
如何阅读源码呢?这是个头疼的问题,但是源码必须要读。阅读源码的时候不要深入代码细节不可自拔,要关注代码的流程并尽量挖掘出对应用层开发有用的结论。另外仔细阅读源码中对一个类或者方法的注释,在看不懂源码时,源码中的注释可以帮你更好地了解源码中的工作原理,这个过程虽然艰苦,但是别无他法。
如何玩转自定义View呢?我的建议是不要通过学习自定义view而学习自定义view。为什么这么说呢?因为自定义view的种类太多了,各式各样的绚丽的自定义效果,如何学的玩呢!我们要透过现象看本质,更多地去关注自定义view所需的知识点,这里做如下总结:
- 搞懂view的滑动原理
- 搞懂如何实现弹性滑动
- 搞懂view的滑动冲突
- 搞懂view的measure、layout和draw
- 然后再学习几个已有的自定义view的例子
- 最后就可以搞定自定义view了,所谓万变不离其宗
大概再需要1-2年时间,即可达到高级工程师的技术水平。我个人认为通过《Android开发艺术探索》和《Android群英传》可以缩短这个过程为0.5-1年。注意,达到高级工程师的技术水平不代表就可以立刻成为高级工程师(受机遇、是否跳槽的影响),但是技术达到了,成为高级工程师只是很简单的事。
技术要求:
- 稍微深入的知识点
AIDL、Messenger、Binder、多进程、动画、滑动冲突、自定义View、消息队列等
- 书籍推荐
《Android开发艺术探索》、《Android群英传》

阅读全文

与java多进程编程相关的资料

热点内容
php登录网页模板 浏览:926
windownginxphp 浏览:508
resync命令 浏览:535
dos命令手册 浏览:286
硅谷编程二维数组 浏览:40
inside游戏什么时候移植安卓 浏览:943
极光安卓是什么 浏览:540
如何减少pdf文件大小 浏览:83
ios屏幕新建文件夹 浏览:297
单片机固定座 浏览:322
一名程序员的生活 浏览:989
服务器电源卡插头如何拔 浏览:487
三水资料加密怎么选 浏览:800
android收不到udp广播 浏览:383
如何免费开手游非官方服务器 浏览:648
全译本和编译 浏览:55
安卓系统如何清理垃圾 浏览:373
word转换pdf转换在线 浏览:199
免费企业网站php源码 浏览:166
javafilebyte 浏览:391