线程
就是进程中的一个负责程序执行的控制单元(执行路径)一个进程可以多执行路径,成为多线程
进程
一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程
线程和进程的区别
1.进程有独立的进程空间,进程中的数据存放空间(堆空间和栈空间)是独立的。
2.线程的堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互影响。
多线程的作用
通过提高程序对CPU的利用率提高程序的效率
多线程的实现
1、通过Thread方法
对run方法实现覆盖重写,Thread类的start方法开启线程。(thread类实现了runnable接口)
2、实现runnable接口
对run方法实现覆盖,把子类的对象传给thread类的构造方法,使用thread类的start方法开启线程。
两者之间的区别
thread实现的多线程各自完成自己的任务
runnable实现的多线程是共同完成一个任务实现,多个线程对一个资源的共享调用
多线程带来的资源同步问题
使用synchronized同步代码块
使用锁机制
package sxd.thread;
public class Demo extends Thread{
private int ticket = 10;
public void run(){
for(int x = 0;x < 10; x++){
if(this.ticket > 0){
System.out.println(Thread.currentThread().getName()+"ticket..."+this.ticket--);
}
System.out.println("...x:"+x+"...name:"+Thread.currentThread().getName());
}
}
}
package sxd.thread;
public class Demo extends Thread{
private int ticket = 10;
public void run(){
for(int x = 0;x < 10; x++){
if(this.ticket > 0){
System.out.println(Thread.currentThread().getName()+"ticket..."+this.ticket--);
}
System.out.println("...x:"+x+"...name:"+Thread.currentThread().getName());
}
}
}
package sxd.runnable;
public class Demo implements Runnable {
private int ticket = 100;
@Override
public void run() {
show();
}
private void show(){
for(int i = 0;i < 200;i++){
synchronized (this) {
if(this.ticket > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"买票..ticket"+ this.ticket--);
}
}
}
}
}
//测试类
package sxd.runnable;
public class RunnableDemo {
public static void main(String[] args) {
Demo a = new Demo();
Thread d1 = new Thread(a,"窗口1");
Thread d2 =new Thread(a,"窗口2");
d1.start();
d2.start();
}
}