`

java多线程 算素数

阅读更多
package WiFiControl;

import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;

public class cNum2 {
	
	private final int szArray = 10000000;
	private final int nMax = (int) Math.sqrt( szArray);
	private final byte[] array = new byte[szArray+1];

	private final int szThread =4;
	private final chkThread[] threads = new chkThread[szThread];
	
	private final AtomicInteger ptr = new AtomicInteger(2);
		
	public cNum2(){
		Arrays.fill(array,(byte)1);
		for(int i=0;i<szThread;i++) threads[i] = new chkThread();
	}
	
//	private boolean ensure(int p){
//		for(chkThread thread : threads){
//			while(thread.p < p) Thread.yield();
//		}
//		return (array[p]==0);
//	}
	
	void start(){
		for(chkThread thread : threads){
			thread.start();
		}
	}
	
	void waitall(){
		for(chkThread thread : threads){
			if(thread.isAlive())
			try {
				synchronized (thread) {
					thread.wait();
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	int size(){
		int sum = 0;
		for(int i = 2 ; i< szArray; i++){
			sum += array[i];
		}
		return sum;
	}
	
	class chkThread extends Thread {
		//private volatile int p = 0;
		
		public void run(){
			long t =  System.currentTimeMillis();
			System.out.println("Thread-"+getId() + ":start, t=" + t);
			while(true){
				int p = ptr.getAndIncrement();
				if(p> nMax) break;
				
				//ensure(p);
				if (array[p]==0) continue;
				
				int i = p;
				while(true){
					p += i;
					if(p <= szArray) array[p]=0;
					else break;
				}
			}
			synchronized (threads) {
				threads.notify();
			}
			System.out.println("Thread-"+getId() + ":end, p=" + 0 +", t=" + (System.currentTimeMillis()-t));
		}
	}
	
	
	public static void main(String [] args){
		cNum2 obj = new cNum2();
		obj.start();
		obj.waitall();
		System.out.println(obj.size());
	}
}

 

分享到:
评论

相关推荐

    java 高级java 多线程 代码

    在这个"高级java 多线程 素数"的主题中,我们主要关注如何在多线程环境中实现素数检测。 素数是自然数中的一个基础概念,它指除了1和其本身外没有其他正因数的数,如2、3、5、7等。在计算机科学中,素数检测有着...

    java多线程使用

    编写两个线程:  第一个线程计算2-1000000之间的质数及个数  第二个线程计算1000000-2000000之间的质数 及个数

    java实现打印素数/质数程序

    在编程领域,素数或质数是指大于1且仅能被1和其本身整除的自然数。在Java中实现打印素数的程序是一项基础但重要的任务,这有助于理解和掌握循环、条件判断以及数学逻辑在编程中的应用。下面将详细解释如何通过Java...

    多线程求连续质数和的完全幂

    标题中的“多线程求连续质数和的完全幂”是指使用多线程技术来解决一个数学问题,即寻找连续质数序列的和,并判断这个和是否为某个整数的完全平方。这个问题融合了计算机科学的并发处理概念与数学的质数与完全平方数...

    Java多线程-对比创建多线程的两种方式

    Java多线程编程中,创建线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。这两种方式虽然都能实现多线程,但它们在实际应用中有着不同的特性和适用场景。 首先,我们来看看继承`Thread`类的方式。这种方式...

    素数Java程序,用于Java第二版教材上的习题求Java素数

    - 对于大量数据,考虑使用并发和多线程技术,如`ExecutorService`,以并行处理多个数值。 5. **测试和调试**: - 使用JUnit进行单元测试,确保素数判断函数的正确性。 - 为了覆盖更多情况,测试边界值(如1、2、...

    Java 求指定范围内素数的个数

    Java 求指定范围内素数的个数,接受用户从键盘输入所求范围,计算出该范围内素数的个数。

    threaded-is-prime:确定数字是否为质数的多线程Java应用程序

    确定数字是否为质数的多线程Java应用程序。 方法 给定数字n和线程数t ,将sqrt(n)的值2均匀划分为t部分。 这些部分由多个线程处理,以检查数字n是否为质数。 样品输出 How many threads do you wish to create? 4 ...

    prime-calculator:一个用 Java 编写的 GUI 多线程素数计算器

    【prime-calculator:一个用 Java 编写的 GUI 多线程素数计算器】 在计算机科学领域,素数是大于1且仅能被1和自身整除的自然数。素数计算是一个基础但又有趣的数学问题,它在密码学、算法优化和计算机图形学等领域有...

    Java 算法面试题 判断质数

    5. **线程安全**:在多线程环境下,如果需要同时判断多个数是否为质数,需要考虑线程安全问题。可以通过同步机制(如`synchronized`关键字)来避免并发问题。 6. **性能优化**:在实际面试中,面试官可能会考察如何...

    java求素数的经典算法

    - 利用多核处理器的优势,将任务分解到多个线程中并行执行。 3. **空间优化**: - 对于非常大的数,可以考虑使用位数组代替整型数组存储素数,以减少内存占用。 4. **缓存机制**: - 将已经计算过的素数结果...

    Java实现多线程轮流打印1-100的数字操作

    在Java编程中,多线程是处理并发任务的关键技术,特别是在需要高效利用系统资源和提高程序响应速度的情况下。本文将详细讲解如何使用Java实现多线程轮流打印1-100的数字,以及在此过程中遇到的并发问题及其解决方案...

    第9章多线程第9章多线程第9章多线程第9章多线程第9章多线程第9章多线程

    `Thread`类是Java多线程编程的基础。它不仅提供了启动、睡眠、运行、让步以及设置优先级等功能,还定义了一个空的`run()`方法。创建线程有两种主要方法:一是实现`Runnable`接口,二是继承`Thread`类并重写`run()`...

    java程序求素数和并输出结果

    对于更高级的应用场景,如处理非常大的数或在高并发环境下求解,可以考虑使用更高效的算法,如埃拉托斯特尼筛法(Sieve of Eratosthenes),或者利用多线程技术加速计算过程。 此外,对于大规模数据的处理,可以...

    基于Java集合类的素数方阵求解.zip

    同时,合理地使用多线程或者并发工具,如ExecutorService和Future,可以进一步提升大规模素数方阵求解的性能。 总结来说,“基于Java集合类的素数方阵求解”这一主题涵盖了Java编程、算法设计、集合框架的使用,...

    Java输出n以内的所有素数

    2. 并行计算:如果范围很大,可以考虑使用多线程或并行流进行并行处理,加快计算速度。 3. 更多筛选方法:除了埃拉托斯特尼筛法,还有其他如 wheel factorization, segmented sieve 等更高级的算法,可以根据需求...

    打印出100以内的质数Java

    - **多线程**:在大型数据集上,可以考虑使用多线程并行处理,加快计算速度。 总结,打印100以内的质数是学习Java基础和算法的好练习。通过这个过程,你可以深入了解循环、条件语句、数学运算以及算法设计等核心...

    Java开发技术大全(500个源代码).

    ThreadImRunnable.java 继承Runnable接口实现多线程 mulThread.java 创建多个线程对象的类 demoJoin.java 演示使用join()以确保主线程最后结束 clicker.java 一个计数用的线程类 demoPri.java 调用上面这个类...

    uThreadPool线程池示例(查找0-1亿之间的质数任务)

    线程池是并发编程中的重要概念,特别是在Java和C++等多线程环境中,它能够有效地管理和调度线程资源,提高系统的效率。本示例中,我们关注的是一个基于`uThreadPool`实现的线程池,它用于执行查找0到1亿之间所有质数...

    java编程常见50例

    5. **多线程**:Java支持多线程编程,通过`Thread`类或者实现`Runnable`接口来创建线程。了解线程同步机制如`synchronized`关键字、`wait()`, `notify()`方法,以及`Lock`接口,能有效避免并发问题。 6. **集合框架...

Global site tag (gtag.js) - Google Analytics