多进程:在操作系统中(同时)运行多个任务(程序)

多线程:在同意应用程序中有多个顺序流(同时)执行

线程的执行过程

 

                       

一、创建线程的方法:

(1)定义一个线程类,它继承类Thread并重写其中的方法run(),方法()称为线程体,由于java只支持单继承,所以这种方法定义的类不能再继承其他类

代码:

class FirstThread extends Thread{

         public void run(){

                   for(int i = 0;i < 100;i++){

                            System.out.println("firstThread-->" + i);

                   }

         }

 

}

class Test{

         public static void main(String args[]){

                   //生成线程类的对象

                   FirstThread ft = new FirstThread();//ft属于一个线程对象

                   //启动线程

                   ft.start();//start为继承Thread得来

                  

                   for(int i = 0;i < 100;i++){

                            System.out.println("main-->" + i);}

                   //ft.run();千万不能这样写

         }//主函数是一个线程,线程对象启动的为第二个线程,第三个为垃圾回收线程

}

运行后结果:

main-->0

main-->1

main-->2

main-->3

main-->4

main-->5

main-->6

main-->7

main-->8

main-->9

main-->10

main-->11

main-->12

main-->13

main-->14

main-->15

main-->16

main-->17

main-->18

main-->19

main-->20

main-->21

main-->22

main-->23

main-->24

main-->25

main-->26

main-->27

main-->28

main-->29

main-->30

main-->31

main-->32

main-->33

main-->34

main-->35

main-->36

main-->37

main-->38

main-->39

main-->40

main-->41

main-->42

main-->43

main-->44

main-->45

main-->46

main-->47

main-->48

main-->49

main-->50

main-->51

main-->52

main-->53

main-->54

main-->55

main-->56

main-->57

main-->58

main-->59

main-->60

main-->61

main-->62

main-->63

main-->64

main-->65

main-->66

main-->67

main-->68

main-->69

main-->70

main-->71

main-->72

main-->73

main-->74

main-->75

main-->76

main-->77

main-->78

main-->79

main-->80

main-->81

main-->82

main-->83

main-->84

main-->85

main-->86

main-->87

main-->88

main-->89

main-->90

main-->91

main-->92

main-->93

main-->94

firstThread-->0

firstThread-->1

firstThread-->2

firstThread-->3

firstThread-->4

firstThread-->5

firstThread-->6

firstThread-->7

firstThread-->8

firstThread-->9

firstThread-->10

firstThread-->11

firstThread-->12

firstThread-->13

firstThread-->14

firstThread-->15

firstThread-->16

firstThread-->17

firstThread-->18

firstThread-->19

firstThread-->20

firstThread-->21

firstThread-->22

firstThread-->23

firstThread-->24

firstThread-->25

firstThread-->26

firstThread-->27

firstThread-->28

firstThread-->29

firstThread-->30

firstThread-->31

firstThread-->32

firstThread-->33

firstThread-->34

firstThread-->35

firstThread-->36

firstThread-->37

firstThread-->38

firstThread-->39

firstThread-->40

firstThread-->41

firstThread-->42

firstThread-->43

firstThread-->44

firstThread-->45

firstThread-->46

firstThread-->47

firstThread-->48

firstThread-->49

firstThread-->50

firstThread-->51

firstThread-->52

firstThread-->53

firstThread-->54

firstThread-->55

firstThread-->56

firstThread-->57

firstThread-->58

firstThread-->59

firstThread-->60

firstThread-->61

firstThread-->62

firstThread-->63

firstThread-->64

firstThread-->65

firstThread-->66

firstThread-->67

firstThread-->68

firstThread-->69

firstThread-->70

firstThread-->71

firstThread-->72

firstThread-->73

firstThread-->74

firstThread-->75

firstThread-->76

firstThread-->77

firstThread-->78

firstThread-->79

firstThread-->80

firstThread-->81

firstThread-->82

firstThread-->83

firstThread-->84

firstThread-->85

firstThread-->86

firstThread-->87

firstThread-->88

firstThread-->89

firstThread-->90

firstThread-->91

firstThread-->92

firstThread-->93

firstThread-->94

firstThread-->95

firstThread-->96

firstThread-->97

firstThread-->98

firstThread-->99

main-->95

main-->96

main-->97

main-->98

main-->99

说明:两个循环运行在不同的线程中(两个循环执行的顺序不一定,抢占cpu,没有规律)

(2)提供一个实现接口Runnable的类作为线程的目标对象,在初始化一个Thread类或者Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体

代码:

class RunnableImpl implements Runnable{

         public void run(){

                   for(int i = 0;i < 100;i++){

                            System.out.println("Runnable-->" + i);}//Runnable的实现类

                           

         }

}

class Test{

         public static void main(String args[]){

         //生成一个Runnable接口实现类的对象

                   RunnableImpl ri = new RunnableImpl();

                   //生成一个Thread对象,并将Runnable接口实现类的对象作为参数传递给该Thread对象

                   Thread t = new Thread(ri);

                   //通知Thread对象执行

                   t.start();

         }

}

运行结果:

D:\>java Test

Runnable-->0

Runnable-->1

Runnable-->2

Runnable-->3

Runnable-->4

Runnable-->5

Runnable-->6

Runnable-->7

Runnable-->8

Runnable-->9

Runnable-->10

Runnable-->11

Runnable-->12

Runnable-->13

Runnable-->14

Runnable-->15

Runnable-->16

Runnable-->17

Runnable-->18

Runnable-->19

Runnable-->20

Runnable-->21

Runnable-->22

Runnable-->23

Runnable-->24

Runnable-->25

Runnable-->26

Runnable-->27

Runnable-->28

Runnable-->29

Runnable-->30

Runnable-->31

Runnable-->32

Runnable-->33

Runnable-->34

Runnable-->35

Runnable-->36

Runnable-->37

Runnable-->38

Runnable-->39

Runnable-->40

Runnable-->41

Runnable-->42

Runnable-->43

Runnable-->44

Runnable-->45

Runnable-->46

Runnable-->47

Runnable-->48

Runnable-->49

Runnable-->50

Runnable-->51

Runnable-->52

Runnable-->53

Runnable-->54

Runnable-->55

Runnable-->56

Runnable-->57

Runnable-->58

Runnable-->59

Runnable-->60

Runnable-->61

Runnable-->62

Runnable-->63

Runnable-->64

Runnable-->65

Runnable-->66

Runnable-->67

Runnable-->68

Runnable-->69

Runnable-->70

Runnable-->71

Runnable-->72

Runnable-->73

Runnable-->74

Runnable-->75

Runnable-->76

Runnable-->77

Runnable-->78

Runnable-->79

Runnable-->80

Runnable-->81

Runnable-->82

Runnable-->83

Runnable-->84

Runnable-->85

Runnable-->86

Runnable-->87

Runnable-->88

Runnable-->89

Runnable-->90

Runnable-->91

Runnable-->92

Runnable-->93

Runnable-->94

Runnable-->95

Runnable-->96

Runnable-->97

Runnable-->98

Runnable-->99

第二种方法更好

二、线程的简单控制方法

1.中断线程

Thread.sleep()//停止运行的时间大于休眠时间(休眠结束后重新开始争夺cpu)

代码:

class RunnableImpl implements Runnable{

         public void run(){

                   for(int i = 0;i < 100;i++){

                            System.out.println("Runnable-->" + i);}//Runnable的实现类

                            if(i == 50){

                                     Thread.sleep(2000);

                            }

                           

         }

}

运行结果:

D:\>javac RunnableImpl.java

RunnableImpl.java:6: 未报告的异常 java.lang.InterruptedException;必须对其进行捕

捉或声明以便抛出

                                Thread.sleep(2000);

                                            ^

1 错误

修改后代码:

class RunnableImpl implements Runnable{

         public void run(){

                   for(int i = 0;i < 100;i++){

                            System.out.println("Runnable-->" + i);//Runnable的实现类

                            if(i == 50){

                            try{

                                     Thread.sleep(2000);

                            }

                            catch(Exception e){

                                     System.out.println(e);

                                     }

                            }

                   }       

         }

}

Thread.yield()

自动让出cpu后再次争夺cpu

2.设置线程的优先级(仅仅是增加进程的运行概率,不是一定运行)

getPriority()

setPriority()

代码:

class Test{

         public static void main(String args[]){

         //生成一个Runnable接口实现类的对象

                   RunnableImpl ri = new RunnableImpl();//代表线程体

                   //生成一个Thread对象,并将Runnable接口实现类的对象作为参数传递给该Thread对象

                   Thread t = new Thread(ri);//代表一个线程

                   //现场的最大优先级10,最小1,可以使用Thread所提供的静态变量来设置现场的优先级

                   t.setPriority(Thread.MAX_PRIORITY);//最大优先级

                   t.setPriority(Thread.MIN_PRIORITY);//最小优先级

                   System.out.println(t.getPriority());//打印出Thread的默认优先级

                   //通知Thread对象执行

                   t.start();

         }

}

三、多线程数据安全

代码:

class MyThread implements Runnable{

         int i = 100;

         public void run(){

                   while(true){

                            synchronized(this){

//程序锁,只进行线程a,结束后再执行线程b保证安全

                            // Thread.currentThread();获取当前代码在那个线程中运行

                            System.out.println(Thread.currentThread().getName() + i);

                            i--;

                            Thread.yield();

                            if(i < 0){

                                     break;

                             }

                    }

          }

}

}

class Test{

         public static void main(String args[]){

        

         MyThread myThread = new MyThread();

         //生成两个Thread对象,但两个Thread共用一个线程体mytThread

         Thread t1 = new Thread(myThread);

         Thread t2 = new Thread(myThread);

         //每一个线程都有名字,可以通过Thread对象的setName()设置线程名字,也可以使用getName获取线程方法

         //分别启动两个线程

         t1.setName("线程a");

         t2.setName("线程b");

        

         t1.start();

         t2.start();

         }

}

四、线程的同步

 

posted on 2012-05-06 22:31  Adonstein  阅读(213)  评论(0编辑  收藏  举报