java,一个程序建立1000个线程,每一个线程加1到一个变量sum。 java 线程同步求和(100分)

JAVA\u7f16\u7a0b \u9898\u76ee\uff1a\u4e00\u4e2a\u542f\u52a8\u5341\u4e2a\u7ebf\u7a0b\u7684\u7a0b\u5e8f,\u6bcf\u4e00\u7ebf\u7a0b\u7ed9\u4e00\u4e2a\u521d\u503c\u4e3a0\u7684\u53d8\u91cfsum\u52a01\u3002

public class TestThread {

public static int sum = 0;

class Add implements Runnable {

@Override
public void run() {
sum += 1;
System.out.println(sum);
}

}

public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(new TestThread().new Add()).start();
}
}

}

\u6211\u5faa\u73af\u4e8610\u6b21\u4e0d\u5c31\u662f10\u4e2a\u7ebf\u7a0b\u90fd\u5f00\u542f\u4e86\u5417\uff1f

// \u4f60\u770b\u770b\u5427\u3002\u3002\u3002 \u4e0d\u61c2\u7684\u5728\u95ee\u6211


public class Test implements Runnable {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) { // \u521b\u5efa100\u4e2a\u7ebf\u7a0b
Test line = new Test();
Thread t = new Thread(line, i + "");
t.start();
}
}

public void run() { // \u7ebf\u7a0b
for (int i = 0; i < 10; i++) { //\u6bcf\u6761\u7ebf\u7a0b\u8f93\u51fa\u7684\u6b21\u6570 \u5982\u679c\u4f60\u662f10\u6b21 100\u4e2a\u7ebf\u7a0b,\u5982\u679c\u540c\u6b65,sum \u5e94\u8be5\u662f1000
try {
sum.list();
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

class sum {
static Integer sum = 0;

public synchronized static void list() { //synchronized \u4ee3\u8868\u7ebf\u7a0b\u540c\u6b65, \u5982\u679c\u53bb\u6389.\u5c31\u4f1a\u4e0d\u540c\u6b65
sum++;
System.out.println("\u6211\u662f\u7ebf\u7a0b" + Thread.currentThread().getName()
+ " sum--------->" + sum);
}

}

1、程序建立1000个线程,有可能造成系统创建大量线程而导致消耗完系统内存,还会增加创建和销毁线程上所花的时间以及系统资源的开销 

2、在创建线程数多的情况下,可以考虑使用线程池

以下是Java自带的几种线程池:

(1)、newFixedThreadPool 创建一个指定工作线程数量的线程池。

每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

(2)、newCachedThreadPool 创建一个可缓存的线程池。

这种类型的线程池特点是:

1).工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。

2).如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。

(3)、newSingleThreadExecutor 创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它,保证顺序执行(我觉得这点是它的特色)。

单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的 。

(4)、newScheduleThreadPool 创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer。

3、示例代码

package test;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
public class ThreadPoolExecutorTest {  
 public static void main(String[] args) {  
  ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
  for (int i = 0; i < 1000; i++) {  
   
   cachedThreadPool.execute(new Runnable() {  
    public void run() {  
         //在这里执行你需要的功能
    }  
   });  
  }  
 }  
}


package com.company;
class Adder {
    private int sum;
    public Adder() { sum = 0; }
    public void addOne() { sum += 1; }
    public int getSum() { return sum; }
}
class AddThread extends Thread {
    private Adder adder;
    public AddThread(Adder a) {
        adder = a;
    }
    public void run() {
        synchronized (adder) {
            adder.addOne();
        }
    }
}
public class Main {
    public static void main(String[] args) {
        Adder a = new Adder();
        Thread[] threads = new Thread[1000];
        for (int i = 0; i < 1000; i++) {
            threads[i] = new AddThread(a);
        }
        for (int i = 0; i < 1000; i++) {
            threads[i].start();
        }
        try {
            for (int i = 0; i < 1000; i++) {
                threads[i].join();
            }
        } catch (InterruptedException e) {
        }
        System.out.println("Sum = " + a.getSum());
    }
}


import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
class SumObj{
int sum;
public SumObj(){
sum=0;
}
public synchronized void addNumToSum(int n){
sum+=n;
}
public synchronized int getSum(){
return this.sum;
}
}
class AddThread implements Runnable{
private SumObj sumObj;

public AddThread(SumObj sumObj){
this.sumObj=sumObj;
}

@Override
public void run() {
this.sumObj.addNumToSum(1);
System.out.println(Thread.currentThread().getName()+" finish add number!");
}
}
public class Test {

public static void main(String[] args) throws IOException {
List<Runnable>threads=new ArrayList<Runnable>();
SumObj sumObj=new SumObj();
for(int i=0;i<1000;i++){
threads.add(new AddThread(sumObj));
}
//开启线程
for(Runnable r:threads){
new Thread(r).start();
}
while(sumObj.getSum()<1000){
try {
Thread.currentThread().sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("sum : "+sumObj.getSum());

}

}


那就new 1000个线程呗 。。。

  • java,涓涓▼搴忓缓绔1000涓嚎绋,姣忎竴涓嚎绋嬪姞1鍒颁竴涓彉閲弒um銆
    绛旓細1銆绋嬪簭寤虹珛1000涓嚎绋嬶紝鏈夊彲鑳介犳垚绯荤粺鍒涘缓澶ч噺绾跨▼鑰屽鑷存秷鑰楀畬绯荤粺鍐呭瓨锛岃繕浼氬鍔犲垱寤哄拰閿姣佺嚎绋嬩笂鎵鑺辩殑鏃堕棿浠ュ強绯荤粺璧勬簮鐨勫紑閿 2銆佸湪鍒涘缓绾跨▼鏁板鐨勬儏鍐典笅锛屽彲浠ヨ冭檻浣跨敤绾跨▼姹 浠ヤ笅鏄Java鑷甫鐨勫嚑绉嶇嚎绋嬫睜锛氾紙1锛夈乶ewFixedThreadPool 鍒涘缓涓涓鎸囧畾宸ヤ綔绾跨▼鏁伴噺鐨勭嚎绋嬫睜銆傛瘡褰撴彁浜や竴涓换鍔″氨鍒涘缓涓涓...
  • 濡備綍鐢Java闅忔満鐢熸垚涓涓1000浣嶇殑鏁板瓧
    绛旓細import java.util.Random;public class BigRandomNumber { / 鐢熸垚涓涓1000浣嶇殑闅忔満鏁,鐢ㄥ瓧绗︿覆琛ㄧず return 杩斿洖鐢熸垚鐨1000浣嶇殑闅忔満鏁 / public static String create() { char[] num = new char[1000];// 鐢熸垚涓涓1000浣嶇殑char鏁扮粍 Random ran = new Random();// 闅忔満鏁扮被 int temp;// 瀛...
  • 鐢JAVA缂栧啓涓涓瀹屾暣鐨绋嬪簭,杈撳嚭1000~2000骞翠箣闂寸殑闂板勾銆
    绛旓細int year=1000;for(;year<=2000;year++) //浠1000寮濮嬪惊鐜,寰幆鍒2000 { if(year%4==0&&year%100!=0||year%400==0) //濡傛灉鏄棸骞 { System.out.println(year); //杈撳嚭骞翠唤 } }
  • 鐢JAVA鍐1000琛岀殑浠g爜,鍐欎粈涔绋嬪簭濂?
    绛旓細鍙互鍐涓涓鐭冲ご鍓瓙甯冪殑灏忔父鎴忥紝鍛戒护琛岀増鐨
  • 濡備綍鐢JAVA搴旂敤绋嬪簭缂栧啓浠1+2+ +n=1000鐨勭▼搴
    绛旓細for(int i=1,j=0;j<=1000;i++){ j+=i;if(j>1000)System.out.println(i);1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276 300 325 351 378 406 435 465 496 528 561 595 630 666 703 741 780 820 861 903 946 990 1035 45 ...
  • 鐢java缂栧啓涓涓▼搴:杈撳嚭1-1000;杈撳嚭鏍煎紡涓0001,0002...1000
    绛旓細public static void main(String[] args){ String str = "";for(int i = 1;i < 10000;i++){ str = String.format("%04d", i);System.out.println(str);} } Java鏄竴闂ㄩ潰鍚戝璞$紪绋嬭瑷锛屼笉浠呭惛鏀朵簡C++璇█鐨勫悇绉嶄紭鐐癸紝杩樻憭寮冧簡C++閲岄毦浠ョ悊瑙g殑澶氱户鎵裤佹寚閽堢瓑姒傚康锛屽洜姝ava璇█鍏锋湁鍔熻兘...
  • 鐢java缂栧啓涓涓鏂规硶鐢ㄤ簬浜х敓1鍒1000涔嬮棿鐨勯殢鏈烘暟
    绛旓細Random random = new Random();int i = random.nextInt(1000);鎻愮ず锛 nextInt(1000); 琛ㄧず浜х敓涓涓闅忔満鏁帮紝杩欎釜闅忔満鏁版槸 0-999 鍗充笉鍖呭惈1000鏈韩銆
  • 鐢java璇█鍐涓涓▼搴,绋嬪簭鐨勫唴瀹,鏄緭鍏ヤ竴涓0锝1000鐨勬暣鏁,姹傚悇浣嶆暟鐨...
    绛旓細int num; Scanner in=new Scanner(System.in); num=in.nextInt(); bai=num/100; shi=(num-bai*100)/10; ge=num-bai*100-shi*10; int sum=bai+shi+ge;//sum灏辨槸浣犺姹傜殑鍜屼簡 鑷繁杈撳嚭鍚
  • 缂栧啓涓涓猨ava绋嬪簭,鐢熸垚10涓1000~9999涔嬮棿鐨勯殢鏈烘暣鏁,灏嗗叾杈撳嚭鍒版帶鍒跺彴...
    绛旓細void main(String[] args) {for(int i = 0;i < 10 ; i++){//Math.random()鐨勫彇鍊艰寖鍥存槸[0,1)//Math.random() * 9000鐨勫彇鍊艰寖鍥存槸[0,8999]//Math.random() * 9000 + 1000鐨勫彇鍊艰寖鍥存槸[1000,9999]int num = (int)(Math.random() * 9000 + 1000);System.out.println(i+1 +...
  • java缂栫▼銆傚畾涔涓涓鏁欏笀绫,鏈夊鍚嶈亴绉板伐璧勫拰宸ラ緞,宸ヨ祫鐨勫垵濮嬪兼槸1000...
    绛旓細String[] args) { Teacher t1 = new Teacher();t1.setName("寮犱笁");t1.setTitle("鏁欏笀");t1.setMoney(5000);t1.setSeniority(5);t1.info();Teacher t2 = new Teacher();t2.setName("鏉庡洓");t2.setTitle("鍔╂暀");t2.setMoney(1500);t2.setSeniority(1);t2.info();} } ...
  • 扩展阅读:java基础题库100题 ... 学java一般能干什么 ... java面试必背100问 ... java程序1加到100 ... 用java计算1-100的和 ... java编程100例全集 ... java实现1到100的求和 ... java计算从1加到100 ... java编程必背的100个程序 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网