创建多线程的方式:
1.实现Runnable接口
2.继承Thread类
1.创建一个Thread类的子类
2.在Thread类的子类中重写Thread类中的run方法,设置线程任务
3.调用Thread类中的start方法,开启新线程,执行run方法
(多次启用一个线程是非法的,特别是线程结束运行后,不能再次启动)
Thread类的常用方法:
public static void sleep(long millis):使当前正在执行的线程以指定的毫秒数暂停,毫秒数结束以后,线程继续执行
public class Sleep {
public static void main(String[] args) {
for (int i = 0; i <= 60; i++) {
System.out.println(i);
//使用Thread类的sleep方法让程序睡眠1秒钟(1000毫秒)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
设置线程的名称:
1.使用Thread类中的方法setName(名字)
void setName(String name)改变线程名称,使之与参数name相同
2.创建爱你一个带参数的构造方法,参数传递线程的名称:调用父类(Thread)给子线程起一个名字
Thread(String name)分配新的Thread对象
Thread和Runnable的区别
并发:多个时间在同一时间段内发生
并行:多个事件在同一时刻发生
匿名内部类实现多线程程序:
主线程:执行主方法(main)的线程
线程安全问题:
多线程访问了共享数据会产生安全问题
解决方式:
1.同步代码块
2.同步方法
3.锁机制
锁对象即同步锁即对象监视器
创建一个锁对象
Object obj = new Object();
同步代码块
synchronized(obj);
原理:同步中的线程没有执行完毕不会释放锁,同步外的线程没有锁进不去同步,如此保证只有一个线程在同步中执行共享数据,保证了安全。
同步方法:
修饰符 synchronized 返回值类型 方法名(参数列表){
可能会出现线程安全问题的代码(访问了共享数据库)
}
静态同步方法:
public static synchronized void 方法名{
可能会出现线程安全问题的代码(访问了共享数据库)
}
Lock锁
java.util.concurrent.locks.Lock
Lock接口方法:
void lock()获取锁
void unlock()释放锁
使用步骤:
1.在成员位置创建一个Reentrantlock对象
2.在可能会出现线程安全的代码前调用lock方法获取锁
3.在可能会出现线程安全的代码后释放锁