多线程的优缺点

多线程的优点:

1)资源利用率更好
2)程序设计在某些情况下更简单
3)程序响应更快

多线程的代价:

1)设计更复杂
虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂。在多线程访问共享数据的时候,这部分代码需要特别的注意。线程之间的交互往往非常复杂。不正确的线程同步产生的错误非常难以被发现,并且重现以修复。
2)上下文切换的开销
当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行。这种切换称为“上下文切换”(“context switch”)。CPU会在一个上下文中执行一个线程,然后切换到另外一个上下文中执行另外一个线程。上下文切换并不廉价。如果没有必要,应该减少上下文切换的发生。

0
Posted in Java

import java.util.*;

class A implements Runnable {
    private int p,a1,a2,a3;
    String s1,s2,s3;
    A(String a,String b,String c){
        s1=a;s2=b;s3=c;
        a1=a2=a3=0;
    }
    void setp(int a){
        p=a;
    }
    public void run(){
        while(true){
                --p;
                String s=Thread.currentThread().getName();
                if(s.equals(s1)){
                    System.out.println(s1+"卖出了1张票,还剩票数"+p);
                    ++a1;
                    System.out.println(a1+" "+a2+" "+a3);
                    if(p<=0){
                        System.out.println(s1+"一共卖了"+a1);
                        return;
                    }
                }
                else if(s.equals(s2)){
                    System.out.println(s2+"卖出了1张票,还剩票数"+p);
                    ++a2;
                    if(p<=0){
                        System.out.println(s2+"一共卖了"+a2);
                        return;
                    }
                }
                else if(s.equals(s3)){

                    System.out.println(s3+"卖出了1张票,还剩票数"+p);
                    ++a3;
                    if(p<=0){
                        System.out.println(s3+"一共卖了"+a3);
                        return;
                    }
                }
                try{
                    Thread.sleep(100);
                }
                catch(InterruptedException e){}
            }
    }
}

public class Main{
    public static void main(String args[ ]){
         A d=new A("1号","2号","3号");
         Thread a,b,c;
         a=new Thread(d);
         b=new Thread(d);
         c=new Thread(d);
         a.setName("1号");
         b.setName("2号");
         c.setName("3号");
         d.setp(200);
         a.start();
         b.start();
         c.start();
    }
}

结果:
2号卖出了1张票,还剩票数197
1号卖出了1张票,还剩票数197
3号卖出了1张票,还剩票数197
1 1 1
2号卖出了1张票,还剩票数196
3号卖出了1张票,还剩票数195
1号卖出了1张票,还剩票数194
2 2 2
1号卖出了1张票,还剩票数193
3 2 2
2号卖出了1张票,还剩票数192
3号卖出了1张票,还剩票数191
1号卖出了1张票,还剩票数190
4 3 3
2号卖出了1张票,还剩票数189
3号卖出了1张票,还剩票数188
1号卖出了1张票,还剩票数187
5 4 4
2号卖出了1张票,还剩票数186
3号卖出了1张票,还剩票数185
1号卖出了1张票,还剩票数184
6 5 5
2号卖出了1张票,还剩票数183
3号卖出了1张票,还剩票数182
1号卖出了1张票,还剩票数181
7 6 6
3号卖出了1张票,还剩票数180
2号卖出了1张票,还剩票数179
1号卖出了1张票,还剩票数178
2号卖出了1张票,还剩票数176
3号卖出了1张票,还剩票数177
8 7 7
2号卖出了1张票,还剩票数175
1号卖出了1张票,还剩票数173
3号卖出了1张票,还剩票数174
9 9 8
2号卖出了1张票,还剩票数172
3号卖出了1张票,还剩票数171
1号卖出了1张票,还剩票数170
10 10 10
2号卖出了1张票,还剩票数169
3号卖出了1张票,还剩票数168
1号卖出了1张票,还剩票数167
11 11 11
2号卖出了1张票,还剩票数166
3号卖出了1张票,还剩票数165
1号卖出了1张票,还剩票数164
12 12 12
2号卖出了1张票,还剩票数163
3号卖出了1张票,还剩票数162
1号卖出了1张票,还剩票数161
13 13 13
2号卖出了1张票,还剩票数160
3号卖出了1张票,还剩票数159
1号卖出了1张票,还剩票数158
14 14 14
2号卖出了1张票,还剩票数157
3号卖出了1张票,还剩票数156
1号卖出了1张票,还剩票数155
15 15 15
3号卖出了1张票,还剩票数153
2号卖出了1张票,还剩票数153
1号卖出了1张票,还剩票数152
16 16 16
3号卖出了1张票,还剩票数151
2号卖出了1张票,还剩票数150
1号卖出了1张票,还剩票数149
17 17 17
3号卖出了1张票,还剩票数148
2号卖出了1张票,还剩票数147
1号卖出了1张票,还剩票数146
18 18 18
3号卖出了1张票,还剩票数145
1号卖出了1张票,还剩票数144
19 18 19
2号卖出了1张票,还剩票数143
3号卖出了1张票,还剩票数142
2号卖出了1张票,还剩票数141
1号卖出了1张票,还剩票数140
20 20 20
3号卖出了1张票,还剩票数139
2号卖出了1张票,还剩票数138
1号卖出了1张票,还剩票数137
21 21 21
3号卖出了1张票,还剩票数136
2号卖出了1张票,还剩票数135
1号卖出了1张票,还剩票数134
22 22 22
3号卖出了1张票,还剩票数133
2号卖出了1张票,还剩票数132
1号卖出了1张票,还剩票数131
23 23 23
3号卖出了1张票,还剩票数130
2号卖出了1张票,还剩票数129
1号卖出了1张票,还剩票数128
24 24 24
3号卖出了1张票,还剩票数127
2号卖出了1张票,还剩票数126
1号卖出了1张票,还剩票数125
25 25 25
3号卖出了1张票,还剩票数124
2号卖出了1张票,还剩票数123
1号卖出了1张票,还剩票数122
26 26 26
3号卖出了1张票,还剩票数121
2号卖出了1张票,还剩票数120
1号卖出了1张票,还剩票数119
27 27 27
3号卖出了1张票,还剩票数118
2号卖出了1张票,还剩票数117
1号卖出了1张票,还剩票数116
28 28 28
3号卖出了1张票,还剩票数115
2号卖出了1张票,还剩票数114
1号卖出了1张票,还剩票数113
29 29 29
3号卖出了1张票,还剩票数112
2号卖出了1张票,还剩票数111
1号卖出了1张票,还剩票数110
30 30 30
3号卖出了1张票,还剩票数109
2号卖出了1张票,还剩票数108
1号卖出了1张票,还剩票数107
31 31 31
2号卖出了1张票,还剩票数106
3号卖出了1张票,还剩票数105
1号卖出了1张票,还剩票数104
32 32 32
2号卖出了1张票,还剩票数103
3号卖出了1张票,还剩票数102
1号卖出了1张票,还剩票数101
33 33 33
2号卖出了1张票,还剩票数100
3号卖出了1张票,还剩票数99
1号卖出了1张票,还剩票数98
34 34 34
2号卖出了1张票,还剩票数97
3号卖出了1张票,还剩票数96
1号卖出了1张票,还剩票数95
35 35 35
2号卖出了1张票,还剩票数94
3号卖出了1张票,还剩票数93
1号卖出了1张票,还剩票数92
36 36 36
2号卖出了1张票,还剩票数91
3号卖出了1张票,还剩票数90
1号卖出了1张票,还剩票数89
37 37 37
2号卖出了1张票,还剩票数88
3号卖出了1张票,还剩票数87
1号卖出了1张票,还剩票数86
38 38 38
2号卖出了1张票,还剩票数85
3号卖出了1张票,还剩票数84
1号卖出了1张票,还剩票数83
39 39 39
2号卖出了1张票,还剩票数82
3号卖出了1张票,还剩票数81
1号卖出了1张票,还剩票数80
40 40 40
2号卖出了1张票,还剩票数79
3号卖出了1张票,还剩票数78
1号卖出了1张票,还剩票数77
41 41 41
2号卖出了1张票,还剩票数76
3号卖出了1张票,还剩票数75
1号卖出了1张票,还剩票数74
42 42 42
2号卖出了1张票,还剩票数73
3号卖出了1张票,还剩票数72
1号卖出了1张票,还剩票数71
43 43 43
2号卖出了1张票,还剩票数70
3号卖出了1张票,还剩票数69
1号卖出了1张票,还剩票数68
44 44 44
2号卖出了1张票,还剩票数67
3号卖出了1张票,还剩票数66
1号卖出了1张票,还剩票数65
45 45 45
2号卖出了1张票,还剩票数64
3号卖出了1张票,还剩票数63
1号卖出了1张票,还剩票数62
46 46 46
2号卖出了1张票,还剩票数61
3号卖出了1张票,还剩票数60
1号卖出了1张票,还剩票数59
47 47 47
2号卖出了1张票,还剩票数58
3号卖出了1张票,还剩票数57
1号卖出了1张票,还剩票数56
48 48 48
2号卖出了1张票,还剩票数55
3号卖出了1张票,还剩票数54
1号卖出了1张票,还剩票数53
49 49 49
2号卖出了1张票,还剩票数52
3号卖出了1张票,还剩票数51
1号卖出了1张票,还剩票数50
50 50 50
2号卖出了1张票,还剩票数49
3号卖出了1张票,还剩票数48
1号卖出了1张票,还剩票数47
51 51 51
2号卖出了1张票,还剩票数46
3号卖出了1张票,还剩票数45
1号卖出了1张票,还剩票数44
52 52 52
2号卖出了1张票,还剩票数43
3号卖出了1张票,还剩票数42
1号卖出了1张票,还剩票数41
53 53 53
2号卖出了1张票,还剩票数40
3号卖出了1张票,还剩票数39
1号卖出了1张票,还剩票数38
54 54 54
2号卖出了1张票,还剩票数37
3号卖出了1张票,还剩票数36
1号卖出了1张票,还剩票数35
55 55 55
2号卖出了1张票,还剩票数34
3号卖出了1张票,还剩票数33
1号卖出了1张票,还剩票数32
56 56 56
2号卖出了1张票,还剩票数31
3号卖出了1张票,还剩票数30
1号卖出了1张票,还剩票数29
57 57 57
2号卖出了1张票,还剩票数28
3号卖出了1张票,还剩票数27
1号卖出了1张票,还剩票数26
58 58 58
2号卖出了1张票,还剩票数25
3号卖出了1张票,还剩票数24
1号卖出了1张票,还剩票数23
59 59 59
2号卖出了1张票,还剩票数22
3号卖出了1张票,还剩票数21
1号卖出了1张票,还剩票数20
60 60 60
2号卖出了1张票,还剩票数19
3号卖出了1张票,还剩票数18
1号卖出了1张票,还剩票数17
61 61 61
2号卖出了1张票,还剩票数16
3号卖出了1张票,还剩票数15
1号卖出了1张票,还剩票数14
62 62 62
2号卖出了1张票,还剩票数13
3号卖出了1张票,还剩票数12
1号卖出了1张票,还剩票数11
63 63 63
2号卖出了1张票,还剩票数10
3号卖出了1张票,还剩票数9
1号卖出了1张票,还剩票数8
64 64 64
2号卖出了1张票,还剩票数7
3号卖出了1张票,还剩票数6
1号卖出了1张票,还剩票数5
65 65 65
2号卖出了1张票,还剩票数4
3号卖出了1张票,还剩票数3
1号卖出了1张票,还剩票数2
66 66 66
2号卖出了1张票,还剩票数1
3号卖出了1张票,还剩票数0
3号一共卖了67
1号卖出了1张票,还剩票数-1
67 67 67
1号一共卖了67
2号卖出了1张票,还剩票数-2
2号一共卖了68
0
Posted in Java

public class Main{
    public static void main(String args[ ]){
        WriteWordThread  zhang,wang;
        zhang=new WriteWordThread("张小红");        //新建线程
        wang=new WriteWordThread("JamsKeven");     //新建线程
        zhang.start();                               //启动线程
        for(int i=1;i<=8;i++){
           System.out.println("我是主线程中的语句");
        }  
        wang.start();                               //启动线程
   }
}
class WriteWordThread extends Thread{         //Thread的子类负责创建线程对象
    WriteWordThread(String s){
        setName(s);                        //调用Thread类的setName方法为线程起个名字
    }
    public void run(){
        for(int i=1;i<=8;i++){
           System.out.println("我是一个线程,我的名字是"+getName());
        }
    }
}
0
Posted in Java

import java.util.*;
import java.util.Map.Entry;
public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        TreeMap<String, Integer> map = new TreeMap<String, Integer>();
        map.put("Anthony", 7);
        map.put("James", 6);
        map.put("Kobe", 24);
        map.put("Durant", 35);
        System.out.println(map.get("Kobe") );
        Set <String> set = map.keySet();
        for (String s : set) {
            System.out.println(s + "=" + map.get(s));
        }
    }
}
0
Posted in Java

import java.util.Calendar;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Calendar c=Calendar.getInstance();
        Scanner read=new Scanner(System.in);
        int year=read.nextInt();
        int month=read.nextInt();
        c.set(year,month-1,1);
        int xinqi=c.get(Calendar.DAY_OF_WEEK)-1;
        String a []=new String [xinqi+31];
        int length=0;
             switch(month)
             {
             case 1:
             case 3:
             case 5:
             case 7:
             case 8:
             case 10:
             case 12:{
                 length=31;
                 break;
             }
             case 4:
             case 6:
             case 9:
             case 11:
             {
                 length=30;
                 break;
             }
             case 2:
             {
                 if((year%4==0&&year%100!=0)||(year%400==0))
                 {
                     length=29;break;
                 }
                 else
                 {
                     length=28;break;
                 }

             }
             }


        //String a []=new String [xinqi+30];
        for(int i=0;i<xinqi;i++)
        {
            a[i]="";
        }
        for(int i=xinqi,n=1;i<xinqi+length;i++)
        {
            a[i]=String.valueOf(n);
            n++;
        }

        for(int i=0;i<a.length;i++)
        {
           if(i%7==0&&i!=0)
           {
               System.out.println();
           }
           System.out.printf("%5s",a[i]);
           if(a[i].equals(String.valueOf(length)))
           {
               break;
           }

        }
    }
}

0
Posted in Java