一、进程和线程的区别
1.1什么是进程?
进程就是当前正在运行的程序,专业一点说就是应用程序在内存中的执行区域
1.2什么是线程?
线程就是进程中的一个执行控制单元,执行路径,一个进程可以有一个线程叫做单线程,也可以有多个线程叫多线程
单线程:安全性高,效率低
多线程:安全性低,效率高
二、线程实现的两种方式
2.1用继承Thread类的方法实现
public class MyThread1 extends Thread{
public void run() {
for(int i=0;i<5;i++) {
System.out.println(getName()+":"+i);//继承了Thread类直接调用Thread类中的方法
}
}
public static void main(String args[]) {
MyThread1 t=new MyThread1();
t.setName("线程1");
MyThread1 t1=new MyThread1();
t.start();
t1.setName("线程2");
t1.start();
}
}
运行结果
2.2Runnable接口实现
public class MyThread implements Runnable {
public static void main(String args[]) {
Runnable tt=new MyThread();
Thread t1=new Thread(tt);//创建一个线程
t1.setName("线程1");
t1.start();
Thread t2=new Thread(tt);
t2.setName("线程2");
t2.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<5;i++) {
System.out.println(Thread.currentThread().getName()+":"+ i);
}
}
}
运行结果
从运行结果看细心的人应该可以看到线程的运行顺序并不是向我们调用方法那样一个方法运行结束才会向下去运行另一个方法,而是两个线程执行的顺序不一定,其实这是CPU执行的结果,CPU在每个线程做着非常快速的选择,也就是说执行哪个线程是随机的先执行哪一个线程也是随机的!
2.3Runable和Thread区别
Runnable中必须重写run()方法,Thread不用
线程运行的都是run()方法
建议选择用Runnable接口方法,这是因为java继承决定的,java只能继承一个类,我需要继承其他的类,但是如果我选择了继承Thread类,那么我就无法去继承我向继承的其他类了
三、多线程模仿火车站售票
public class MyThread implements Runnable {
static int tickets = 10;
Object object = new Object();// 创建一个object类让所有成员访问
public static void main(String args[]) {
Runnable tt = new MyThread();
Thread t1 = new Thread(tt);
t1.setName("窗口一");
t1.start();
Thread t2 = new Thread(tt);
t2.setName("窗口二");
t2.start();
Thread t3 = new Thread(tt);
t3.setName("窗口三");
t3.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
synchronized(object){if (tickets >0) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":" + tickets--);
}
}
}
}
}
在这个程序中我加入了一个Object类,用这个类封装run方法,是为了让所有成员都能访问这个方法,synchronized用这个修饰是上锁只要有一个线程进入run()方法就会被上锁,其他线程都无法访问,这是同步代码块的方法还有一种方法是同步方法直接给run()方法加上关键字synchronized也可以!如果不使用这个修饰改进代码运行会出现问题!希望你们自己去运行实现以下,这个疑问留给你们去探讨!欢迎留言!