标签:
进程的概念:
进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。例如在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张票
标签:
原文地址:http://www.cnblogs.com/jalja/p/4584425.html