1,程序,进程和线程
首先,什么是程序呢?当我们点击Windows左下角的开始按钮,打开菜单中的“所有程序”时,就能看到计算机中安装好的许多各种各样的程序,包括文字处理程序(wps, word),媒体播放程序(Media Player)等。而打开其中任意一个程序的安装包,就会发现其中包括许多不同形式的文件,如.exe,.txt,.jpg等,它们一起组成了不同功能的程序。
那么什么是进程和线程呢?它们的关系又是什么呢?
进程是一个正在执行的程序,而一个线程则是程序内部的一个独立的运行单位。通俗的说,进程就是一个程序,而线程是这个程序能同时做的各种事情。比如,一个音乐播放器运行时就是一个进程,而该播放器同时做的下载文件和播放歌曲就是这个进程中的俩个线程。因此,我们可以说,进程包括线程。
从另一个角度说,每一个进程都有一组完整的属于自己的变量,而线程则共享一个进程中的这些数据。
2,java实现多线程的方法
1,继承Thread类
步骤:
1),写一个类继承Thread类;
2),在这个类中重写Thread类中的run()方法;
3),将线程需要执行的代码放入run()方法中;
4),实例化线程对象,调用其start()方法来启动该线程。
Thread类中的方法:
run() 线程的运行方法
start() 线程的启动方法
currentThread() 获得线程的名字和优先级
线程的启动是虚拟机JVM完成的。启动线程时必须用start()函数,而不能用run()函数。
举个例子:
package Thread;
public class ThreadDemo extends Thread{
public int id;
public ThreadDemo(int id){
this.id = id;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("1,启动");
for(int i = 1;i < 10;i++){
ThreadDemo td = new ThreadDemo(i);
td.start();
}
System.out.println("3,启动");
}
public void run(){
while(true){
try {
Thread.sleep(id*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("2,运行" + id);
}
}
}
将这段代码运行一下,输出的结果是1,3,2。而如果我们将td.start();语句换成td.run();呢?
再运行一下,我们就会发现,结果变成了1,2,3.为什么呢?
当调用start函数时,这个程序中共有两个相互独立的线程:main函数中的主线程和run函数的子线程。而这个函数的作用就是告知虚拟机这里有线程要启动,run函数中的代码是否执行完毕与main函数中的代码是无关的。通俗的说,start函数就相当于短跑比赛中的裁判员,裁判开枪后示意比赛开始,而不同运动员跑步速度不同是不会相互影响的。
2,继承Runnable接口
步骤:
1),写一个类继承Runnable接口
2),在这个类中重写Runnable接口中的run()方法;
3),将线程需要执行的代码放入run()方法中;
4),实例化Thread类的对象,实例化Runnable实现类的对象,并将后者传入Thread类对象的构造函数;
5),调用Thread对象的start()方法启动线程。
package Thread;
public class RunableDemo implements Runnable{
public int id;
public RunableDemo(int id) {
// TODO Auto-generated constructor stub
this.id = id;
}
public static void main(String[] args){
System.out.println("1,启动");
for(int i = 1;i < 10;i++){
RunableDemo rd = new RunableDemo(i);
Thread th = new Thread(rd);
th.start();
}
System.out.println("3,启动");
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(id*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("2,运行" + id);
}
}