1、线程
多线程提高效率的原理:进程拥有的线程数越多,被执行的概率就越大,提高其效率。
线程的生命周期:创建线程对象(2种方法)
就绪 等待wait(),notify()
运行
线程对象编程垃圾
2、线程的创建的两种方法:
第一种是继承Thread接口,但是这种方法不能继承其他的接口。代码如下所示:
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName()+':'+i); //getName是获取线程的名字
}
}
}
线程的运行代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread mt = new MyThread();
mt.setName("老王"); //setName是设置线程的名字
mt.start();
MyThread mt1 = new MyThread();
mt1.setName("张三");
mt1.start();
}
第二种方法是实现Runable接口,这种方法的好处是可以继承其他的接口。代码如下:
public class MyThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+':'+i);
}
} //这种方式获取线程的名字只能用Thread.currentThread().getName()
线程运行:
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread mt = new MyThread();
Thread t = new Thread(mt);
t.setName("李四");
t.start();
Thread t1 = new Thread(mt);
t1.setName("张三");
t1.start();
}//在这里t和t1不是共享,如果让其共享则只要指向同一个对象就可以了
上述两种线程会出现不同步的问题,不够安全。为了解决这个问题可以使用synchronized:同步锁,可以修饰代码块和方法。锁对象需要被所有的线程锁共享。代码如下:
while (true) {
synchronized (object) { //加入线程锁 安全性提高了,但是效率低
if(tickets>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+tickets--);
}
}
}//将需要上锁的代码块直接用synchronized (object)包起来,object是锁对象需要定义
//Object object = new Object();
第二种锁的使用方法可以直接当做修饰符来使用,比如:
private synchronized void method() {
while (true) {
//加入线程锁 安全性提高了,但是效率低
if(tickets>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+tickets--);
}
}
使用synchronized当做修饰符,是一个非静态的方法,锁对象是this。
但是静态方法的锁对象不是this,而是当前类的字节码对象。