码迷,mamicode.com
首页 > 编程语言 > 详细

java 多线程

时间:2015-06-17 22:57:16      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

进程的概念:

  进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。例如在Windows系统中,一个运行的exe就是一个进程。

线程的概念:

  线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。

一、Java中的线程

  Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新Thread对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。同时JVM也负责线程的调度。线程调度是值按照特定的机制为多个线程分配CPU的使用权。调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;抢占式调度是根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。

  1.多线程实现方式一      继承 Thread类

public class TestThread1 extends Thread {
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println("TestThread1=======>"+i);
        }
    }
}
class TestThread2 extends Thread{
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println("TestThread2========>"+i);
        }
    }
}
//测试
public static void main(String[] args) { TestThread1 th1=new TestThread1(); TestThread2 th2=new TestThread2(); th1.start(); th2.start(); }
//结果

TestThread1=======>0
TestThread2========>0
TestThread1=======>1
TestThread2========>1
TestThread1=======>2
TestThread2========>2
TestThread1=======>3
TestThread2========>3
TestThread1=======>4
TestThread2========>4
TestThread1=======>5
TestThread2========>5
TestThread1=======>6
TestThread2========>6
TestThread1=======>7
TestThread2========>7
TestThread1=======>8
TestThread2========>8
TestThread1=======>9
TestThread2========>9

 2、实现   Runnable 接口 (静态代理模式)

  

public class RunnableTest1 implements Runnable{
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println("RunnableTest1==============>"+i);
        }
    }
}
class RunnableTest2 implements Runnable {
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println("RunnableTest2==============>"+i);
        }
    }
}
//测试
public static void main(String[] args) { //创建真实角色 RunnableTest1 rt1=new RunnableTest1(); RunnableTest2 rt2=new RunnableTest2(); //创建代理角色+真实角色的引用 Thread thread1=new Thread(rt1); Thread thread2=new Thread(rt2); //启动 thread1.start(); thread2.start(); }
//结果
    

RunnableTest1==============>0
RunnableTest1==============>1
RunnableTest2==============>0
RunnableTest1==============>2
RunnableTest1==============>3
RunnableTest1==============>4
RunnableTest2==============>1
RunnableTest1==============>5
RunnableTest2==============>2
RunnableTest1==============>6
RunnableTest1==============>7
RunnableTest2==============>3
RunnableTest1==============>8
RunnableTest2==============>4
RunnableTest1==============>9
RunnableTest2==============>5
RunnableTest2==============>6
RunnableTest2==============>7
RunnableTest2==============>8
RunnableTest2==============>9

 

  两种实现方式的区别和联系:

    在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

  • 避免点继承的局限,一个类可以继承多个接口。
  • 适合于资源的共享 

    

技术分享
 1 //资源共享
 2 public class TrainTest implements Runnable {
 3     private int num=5;
 4     public void run() {
 5         while(true){
 6             if(num<=0){
 7                 break;
 8             }
 9             System.out.println(Thread.currentThread().getName()+"抢到第"+num--+"张票");
10         }
11     }
12     public static void main(String[] args) {
13         TrainTest tt=new TrainTest();
14         Thread t1=new Thread(tt, "NNNN");
15         Thread t2=new Thread(tt, "AAAA");
16         Thread t3=new Thread(tt, "MMMMM");
17         t1.start();
18         t2.start();
19         t3.start();
20     }
21 }
22 MMMMM抢到第5张票
23 NNNN抢到第4张票
24 AAAA抢到第3张票
25 NNNN抢到第1张票
26 MMMMM抢到第2张票
View Code

 

java 多线程

标签:

原文地址:http://www.cnblogs.com/jalja/p/4584425.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!