------- android培训、java培训、期待与您交流! ----------
进程与线程:
进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程。多进程操作系统能同时运行多个进程(程序),CPU具备分时机制所以每个进程都能循环获得自己的CPU时间片,CPU执行速度非常快使得所有程序好象是在“同时”运行一样。
线程是比进程更小的执行单位,是进程内部单一的一个顺序控制流。所谓多线程是指一个进程在执行过程中可以产生多个线程,这些线程可以同时存在、同时运行,形成多条执行线索。一个进程可能包含了多个同时执行的线程。
多线程是实现并发机制的一种有效手段,进程和线程一样都是实现并发的一个基本单位。
进程和线程:
1、同样作为基本的执行单元,线程是划分得比进程更小的执行单位。
2、每个进程都有一段专用的内存区域,线程却共享内存单元(包括代码和数据),通过共享的内存单元来实现数据交换、实时通信与必要的同步操作。
多线程的应用范围很广,一般情况下程序的某些部分同特定的事件或资源联系在一起,同时又不想为它而暂停程序其它部分的执行,这种情况下就可以考虑创建一个线程与那个事件或资源关联到一起,并让它独立于主程序运行。通过使用线程可以避免用户在运行程序和得到结果之间的停顿,还可以让一些任务(如打印任务)后台运行,而用户则在前台继续完成一些其它的工作。总之利用多线程技术,可以使程序员方便地开发出能同时处理多个任务的功能强大的应用程序。
线程(Thread)是指程序的运行流程,“多线程”的机制则是指可以同时运行多个程序块,使程序运行的效率变得更高,也可克服传统编程语言所无法解决的问题。例如:有些包含循环的线程可能要使用比较长的一段时间来运算,此时便可让另一个线程来做其它的处理。
示例1:
传统的单线程:
public class ThreadTest
{
public static void main(String args[])
{
new Thread().run();
for(int i=0;i<10;i++) // 循环输出
{
System.out.println("main 线程在运行");
}
}
}
class Thread
{
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println("Thread 在运行");
}
}
}
运算结果如下:
C:\Users\lenovo\Desktop>javac ThreadTest.java
C:\Users\lenovo\Desktop>java ThreadTest
Thread 在运行
Thread 在运行
Thread 在运行
Thread 在运行
Thread 在运行
Thread 在运行
Thread 在运行
Thread 在运行
Thread 在运行
Thread 在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
C:\Users\lenovo\Desktop>
创建线程的方式:
1、定义类继承Thread使自己成为它的子类,或者实现Runnable接口。
2、复写类中的run方法目的是将自定义代码存储在run方法,让线程运行。
3,调用线程的start方法,该方法两个作用:启动线程,调用run方法。
继承Thread类定义格式:
class 类名称 extends Thread //从Thread类扩展出子类
{
属性;
方法......;
修饰符 run() //复写Thread类里的run()方法
{
线程处理的程序;
}
}
实现Runnable类定义格式:
class 类名称 implements Runnable //实现Runnable接口
{
属性;
方法......;
修饰符 run() //复写Runnable里的run()方法
{
线程处理的程序;
}
}
示例2:
继承Thread类的方式:
public class ExtendsThreadTest
{
public static void main(String args[])
{
new ThreadTest().start(); //调用Thread类中的start()方法,实际上是调用run()方法
for(int i=0;i<10;i++)
{
System.out.println("main 线程在运行");
}
}
}
class ThreadTest extends Thread //ThreadTest类继承了Thread类,此类就实现了多线程
{
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println("ThreadTest 线程在运行");
}
}
}
运算结果如下:
C:\Users\lenovo\Desktop>javac ExtendsThreadTest.java
C:\Users\lenovo\Desktop>java ExtendsThreadTest
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
ThreadTest 线程在运行
ThreadTest 线程在运行
ThreadTest 线程在运行
ThreadTest 线程在运行
ThreadTest 线程在运行
ThreadTest 线程在运行
ThreadTest 线程在运行
ThreadTest 线程在运行
ThreadTest 线程在运行
ThreadTest 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
C:\Users\lenovo\Desktop>
实现Runnable类的方式:
public class RunnableThreadTest
{
public static void main(String args[])
{
new Thread(new ThreadTest()).start(); //产生Runnable接口的子类实例化对象,通过Thread类的start()方法启动多线程序
for(int i=0;i<10;i++)
{
System.out.println("main 线程在运行");
}
}
}
class ThreadTest implements Runnable //TestThread通过实现Runnable接口,实现多线程
{
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println("ThreadTest 在运行");
}
}
}
运算结果如下:
C:\Users\lenovo\Desktop>javac RunnableThreadTest.java
C:\Users\lenovo\Desktop>java RunnableThreadTest
main 线程在运行
ThreadTest 在运行
ThreadTest 在运行
ThreadTest 在运行
ThreadTest 在运行
ThreadTest 在运行
ThreadTest 在运行
ThreadTest 在运行
ThreadTest 在运行
ThreadTest 在运行
ThreadTest 在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
main 线程在运行
C:\Users\lenovo\Desktop
从输出结果中可以发现,继承Thread类还是实现了Runnable接口运行的结果都是一样的。
实现了Runnable接口还需要调用Thread类中的start()方法才能启动多线程,通过查找JDK文档可以发现,Runnable接口中只有一个run()方法并没有start()方法,所以一个类实现了Runnable接口也必须用Thread类中的start()方法来启动多线程。通过查找JDK文档中的Thread类发现,在Thread类之中有一个构造方法:
public Thread(Runnable target)
由此构造方法可以将一个Runnable接口的实例化对象作为参数去实例化Thread类对象。在实际的开发中尽可能去使用Runnable接口去实现多线程机制。