我们先来看看什么是进程,进程就是指当前正在运行的程序,一个应用程序在内存中的执行区域;二线程:是指运行的一个程序,线程依赖于进程。进程中可以有一个或多个线程,但是单线程(单个执行)安全性高,效率低,多线程(多个同时执行)安全性低,效率高比如360、迅雷等就是一个多线程,
多线程的实现方式有两种:
1.是继承Thread类,并且重写run方法,分配并启动子类的实例并且线程具有随机性比如
public class MyThread extends Thread{
@Override
public void run() {
for(int i=0;i<100;i++) {
System.out.println(getName()+":"+i);
}
}
public class ThreadDemon1{
public static void main(String[] args){
//创建线程实例
MyThread mt=new MyThread();
//设置名字
mt.setName(“张三”);
//启动线程
mt.start();
//创建线程实例
MyThread mt1=new MyThread();
//设置名字
mt1.setName(“张三”);
//启动线程
mt1.start();
}
}
2.创建一个线程是声明实现类Runnable接口。 那个类(实现接口的类)然后实现了run方法。 然后可以分配类的实例,在创建Thread对象时作为参数传递,并启动;
还是以上面的为例加以改变
public class MyThread2 implements Runnable{
int num ;
public MyThread2(int num) {
this.num=num;
}
@Override
public void run() {
for(int i=0;i<100;i++) {
System.out.println(Thread.currentThread().getName()+":"+i +num);
}
}
}
注意 不能直接获取getXxx()方法,则此时需要Thread currentThread().xxx返回对当前正在执行的线程对象的引用。
public class ThreadDemon2 {
public static void main(String[] args) {
//创建线程的实例
MyThread2 mt=new MyThread2(100);
//如果说只创建一个线程实例,那么它的成员都是共用这一个实例
Thread t=new Thread(mt);
//启动线程
t.setName("王五");
t.start();
Thread t1=new Thread(mt);
//启动线程
t1.setName("丽萨");
t1.start();
}
}
我在这推荐使用方式二,因为方式一中的继承只支持单一继承,具有一定的局限性
休眠线程:static Thread.sleep();
例如售卖火车票是,我们可以使用多个线程、休眠线程,由于多个线程并发的访问共享的数据,可能会出现一些小问题。这时我们可以使用锁对象来解决
synchronized: 同步,被修饰的代码块和方法一旦被某个线程访问,则直接锁住,其他的线程将无法访问;也可以作为修饰符即为同步方法
语法为 synchronized(锁对象){
}
注意:锁对象需要被所有的线程共享(即创建Object对象)
非静态的同步方法的锁对象this
静态的同步方法的锁对象是当前类的字节码对象