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\u3002public 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个线程呗 。。。
绛旓細1銆绋嬪簭寤虹珛1000涓嚎绋嬶紝鏈夊彲鑳介犳垚绯荤粺鍒涘缓澶ч噺绾跨▼鑰屽鑷存秷鑰楀畬绯荤粺鍐呭瓨锛岃繕浼氬鍔犲垱寤哄拰閿姣佺嚎绋嬩笂鎵鑺辩殑鏃堕棿浠ュ強绯荤粺璧勬簮鐨勫紑閿 2銆佸湪鍒涘缓绾跨▼鏁板鐨勬儏鍐典笅锛屽彲浠ヨ冭檻浣跨敤绾跨▼姹 浠ヤ笅鏄Java鑷甫鐨勫嚑绉嶇嚎绋嬫睜锛氾紙1锛夈乶ewFixedThreadPool 鍒涘缓涓涓鎸囧畾宸ヤ綔绾跨▼鏁伴噺鐨勭嚎绋嬫睜銆傛瘡褰撴彁浜や竴涓换鍔″氨鍒涘缓涓涓...
绛旓細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;// 瀛...
绛旓細int year=1000;for(;year<=2000;year++) //浠1000寮濮嬪惊鐜,寰幆鍒2000 { if(year%4==0&&year%100!=0||year%400==0) //濡傛灉鏄棸骞 { System.out.println(year); //杈撳嚭骞翠唤 } }
绛旓細鍙互鍐涓涓鐭冲ご鍓瓙甯冪殑灏忔父鎴忥紝鍛戒护琛岀増鐨
绛旓細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 ...
绛旓細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璇█鍏锋湁鍔熻兘...
绛旓細Random random = new Random();int i = random.nextInt(1000);鎻愮ず锛 nextInt(1000); 琛ㄧず浜х敓涓涓闅忔満鏁帮紝杩欎釜闅忔満鏁版槸 0-999 鍗充笉鍖呭惈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灏辨槸浣犺姹傜殑鍜屼簡 鑷繁杈撳嚭鍚
绛旓細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 +...
绛旓細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();} } ...