一、应用程序、进程和线程
在开始讲进程前,我们来区别一下这三者,应用程序就是可执行的代码,存放在硬盘,当执行程序时,就会产生进程,而一个进程会有单线程与多线程之分,在程序运行中,进程的数据会从硬盘写入到内存中,CPU工作时,会把内存中的数据写入到寄存器中,所以内存和寄存器中的数据并不完全同步,这点注意一下,后边会再讲到。
二、线程的作用是什么呢?
假如我们要做一个飞机大战的游戏,那么有很多敌机对不对,而他们的飞行路径和攻击时刻等等都不同,这时候,假如只有一个线程,那就无法处理,因此,线程应运而生,多线程的优势在于同时处理。
线程是可以很多的,上千也没有问题。但其实我们的电脑常见的就4个或8个进程,这是怎么回事呢?其实,cpu的运行速度很快,其实cpu在不断地切换线程,只是我们感觉不到罢了。
三、线程怎么工作的?
首先JVM会自行启动一个线程(即主线程)来执行主函数内的代码,假如你写了子线程,那么JVM会启动新进程。主线程只负责启动、关闭子线程。其余时候主线程和子线程都是单独运行的。
四、怎么写一个多线程的程序
线程要用到Thread类,我们可以通过继承Thread类或TimeTask类,也可以实现Runnable接口,或者在内部定义。
与Thread相关的关键字有run、sleep、start等等。
start:启动线程,格式为:对象名 . start ( ) ;
run:启动线程后,会执行run方法中的代码,一般会用循环来重复执行。
sleep:通常是Thread.sleep(sleeptime);这里的sleeptime指线程暂停的时间,因为cpu运行很快,假如不暂停一下,你会发现多线程游戏的运动贼快,而且会耗占大量资源,电脑因此变卡。
//示例
public class Thread1 implements Runnable{
public Thread1(int id) {
this.id=id;
}
private int id;
public static void main(String[] args) {
//构建10个线程
for(int t=1000;t<1010;t++){
//实例化本类,且传入id参数t
Thread1 th1 =new Thread1(t);
//实例化Thread类,并添加th1对象
Thread th=new Thread(th1);
//启动线程
th.start();
}
}
public void run(){
while (true){
long currentTime=System.currentTimeMillis();
System.out.println(id+"号线程:"+currentTime);
try{
Thread.sleep(this.id*1000);
}catch(InterruptedException ie){
System.out.print("dsg"+ie);
}
}
}
}
当我们运行后,就会有如下的输出。
我们可以看到1001到1009号线程的顺序是混乱的,你再多试几次,会发现每次的顺序都不同,这是因为线程的运行具有一定的随机性,这个我们控制不了。
线程的概念和基本实现就到此为止了,下次我们可以尝试做个多个小球不断运动的界面。