javaweb开发,有多线程的地方,已经使用servlet容器或者其他的框架进行封装了
开启多线程是为了同时运行多部分代码,每个线程都有自己的代码任务
Thread类用于描述多线程,run方法定义了需要执行的任务代码
创建线程方式1:继承Thread类,并复写run方法,调用start方法,开启线程并调用线程的任务执行run方法
Class Demo extends Thread{
private Stirng name;
Demo(String name){
this.name =name;
}
public void run(){
for(int x = 0; x < 10; x++){
System.out.println(name + "...x=" + x + "...ThreadName=" +
Thread.currentThread ().getName());
}
}
Class ThreadDemo{
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.start();
d2.start();
for(int x = 0; x < 20; x++){
System.out.println("x = " + x + "...over..." +
Thread.currentThread().getName());
}
}
创建线程的方式2:
定义类实现Runnable接口,覆盖Runnable接口的run方法,将线程的任务代码封装到run方法中
通过Thread 类创建线程对象,并把Runnable接口的子类对象作为Thread类的构造参数进行传递. 因为要执行的任务封装到了Runnable子类对象的run
方法中,所以在创建线程的时候就声明要运行的任务
调用start开启线程
好处: 将线程的任务从线程的子类中分离出来.
Class Demo implements Runnable{
public void run(){
show();
}
public void show(){
for(int x = 0; x < 20; x++){
System.out.println(Thread.currentThread().getName() + "..." + x);
}
}
}
Class ThreadDemo{
Demo d = new Demo();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t2.start();
}]
线程安全问题产生的原因:
当多个线程在操作共享的数据,
1.可以使用同步代码块来处理.
synchronized(对象){
需要被同步的代码
}
缺点: 每个线程都会去判断锁,浪费资源.
同步的前提:必须有多个线程并使用同一个锁.
2.同步函数来解决
同步函数的锁是this,同步代码块的锁是任意的对象
死锁:你无法获得我的锁,我也无法获得你的锁.