什么是进程?什么是线程?
进程是:一个应用程序(1个进程是一个软件)。
线程是:一个进程中的执行场景/执行单元。
注意:一个进程可以启动多个线程
进程和线程是什么关系?
进程:可以看做是现实生活当中的公司。
线程:可以看做是公司当中的某个员工。
注意:进程A和进程B的 内存独立不共享
。
线程A和线程B是什么关系?
在java语言中:线程A和线程B,堆内存 和 方法区 内存共享。但是 栈内存 独立,一个线程一个栈。
eg.假设启动10个线程,会有10个栈空间,每个栈和每个栈之间,互不干扰,各自执行各自的,这就是多线程并发。
eg.
火车站,可以看做是一个进程。
火车站中的每一个售票窗口可以看做是一个线程。
我在窗口1购票,你可以在窗口2购票,你不需要等我,我也不需要等你。所以多线程并发可以提高效率。
由于线程可以独立完成自己的任务,这样一来,程序便可以实现更加丰富的功能,这也是设计游戏时需要掌握的技能。
怎么创建线程
编写一个类,直接 继承 java.lang.Thread
,重写 run方法
。
创建线程对象 —— new继承线程的类。
启动线程 —— 调用线程对象的 start()
方法。
关于线程的sleep方法
方法名 : static void sleep(long millis) 作用 : 让当前线程休眠millis秒 参数是 毫秒
作用: 让当前线程进入休眠,进入“阻塞状态”,放弃占有CPU时间片,让给其它线程使用。
这行代码出现在A线程中,A线程就会进入休眠。
这行代码出现在B线程中,B线程就会进入休眠。
Thread.sleep()方法,可以做到这种效果:间隔特定的时间,去执行一段特定的代码,每隔多久执行一次。
// 睡眠1秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
java内部有Thread类,我们为其创建一个对象便是一个线程。假设我在做飞机大战这个线程游戏。我们这里只介绍框架的搭建,不具体谈方法体。首先,我创建了一个ThreadDraw 类继承Thread类,然后重写run方法,写了一个for循环模拟飞机大战中射击的子弹。然后加上延时,这样我们就可以控制程序执行的频率了,此时需要抛出异常。
public class ThreadDraw extends Thread {
private Graphics g;
private int count = 10;
public ThreadDraw(Graphics g, int count) {
this.g=g;
this.count= count;
}
public void run(){
int x=20;int y = 100;
for (int i=0;i<250;i++){
g.setColor(Color.red);
g.fillOval(x+count,y+i,10,10);
try {
Thread.sleep(30);//2ghz , 3ghz
}catch (Exception ef){}
//覆盖背景
g.setColor(Color.BLACK);
g.fillRect(0,100,500,600);
}
}
}
有了线程的类,我们只有为其创建具体的对象才能够实现这个线程。于是我们在想创建线程的地方为其申明一个对象。然后在方法内创建并启动这个线程。注意,我们用到的是start()方法来启动这个线程。
public void actionPerformed(ActionEvent e) {
//1.创建一个线程类的对象
count += 40;
ThreadDraw td = new ThreadDraw(g,count);
//2.启动这个线程对象
td.start();
System.out.println("已经启动一个线程对象去画了");
}
然后程序便会不断执行run()方法的内容了。你可以在run方法内写任意你想执行的内容。
多线程的实现
多线程的实现方法即创建多个类继承Thread类,然后分别在其中重写run()方法,然后创建类的对象,并start即可。这样一来就可以多个线程同时运行了。
线程 同步锁
在多线程的运行过程中可能也会遇到一些问题,比如线程的同步问题。各个线程看似彼此独立,但其实他们是轮流使用cpu的资源,线程的同步就是协同步调,按预定的先后次序进行运行。
如果没有线程的同步,如果一个线程过长,可能会出现方法没有执行完就被别的线程抢占资源这类情况。所以为了线程的同步,我们需要加上同步锁,这里我们介绍一种最方便实现的同步锁synchronized。
我们只要在方法的public后加上synchronized即可,这可以确保次方法执行完之后才会把cpu资源让给别的线程。
例如:public synchronized void gameRun(){ }。