1.多线程的概念:如果希望程序中实现多段代码交替运行的效果,则需要创建多个线程。多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。
2多线程的两种实现方式:
(1)继承Thread,重写里面run方法
(2)实现Runnable 接口, 实现了Runnable接口的对象
3.线程的类型:
(1)主线程:当一个程序启动时,就有一个进程被操作系统创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread)。每个进程至少都有一个主线程,主线程通常最后关闭。
(2)子线程:在程序中创建的其他线程,相对于主线程来说就是这个主线程的子线程。
(3)守护线程:daemon thread,对线程的一种标识。守护线程为其他线程提供服务,如JVM的垃圾回收线程。当剩下的全是守护线程时,进程退出。
4.线程的静态方法:Thread.sleep(long mi); //线程休眠
Thread.currentThread(); //当前线程
Thread.yield();//线程让步
5.对象方法 : t = new Thread();//创建一个线程对象
t.start() ; // 开启线程
t.getName(); //获取当前线程的名字
t.getPriority(); //优先级[1,10](默认值为5)
t.setDaemon(true) ; //设置守护线程GC:垃圾回收器,它是一个守护线程,一般的Thread都是用户线程
t.join(); // t加入到默认线程
6.线程项目:小球
解决闪屏问题:将小球画在一个图片上,然后把这个图片画在窗体上
第一步:创建一张图片
Image img = createImage(getWidth(), getHeight());
第二步: 图片上画小球,首先要拿到图片的笔
Graphics img_g = img.getGraphics();
img_g.fillOval(x, y, 100, 100);
第三步:把图片画到窗体,窗体的笔参数g
g.drawImage(img, 0, 0, null);
小球线程类
新建一个Ball 类 实现runnable接口
封装 属性
run方法里面 一直执行 while true必须sleep
runnable 线程必须结合 Thread开启
注意:明确创建小球(new )的时机,避免空指针异常
创建小球后,在窗体中重写父类的paint里面绘画
先设置笔的颜色,然后画小球
7.线程安全问题:线程安全的约束是指一个函数被多个并发线程反复调用时,要一直产生正确的结果。要保证线程安全,主要是通过加锁的方式保证共享变量的正确访问。
线程安全对共享变量互斥访问。当多个线程类并发操作某类的某个方法,来修改这个类的某个成员变量的值,不会出错,则我们就说,该的这个方法是线程安全的。
某类的某方法是否线程安全:
(1) 该方法是否修改该类的成员变量;
(2) 是否给该方法加锁(是否用synchronized关键字修饰)。
产生原因:多个线程,修改公共的资源、变量,多行代码
解决办法:
同步代码块
synchronized(对象){同步代码块}
每个对象有个标志位 1(开)2(关)
参数对象起到了锁的作用,叫对象锁
{…}代码块在synchronized的代码块叫同步代码块
同步方法
普通方法:同步方法的对象锁是this,代表当前对象
静态方法:同步方法是当前类
8.死锁问题:所谓死锁,是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。
产生原因:锁的嵌套,多个线程相互把持锁互不相让
解决方法:让所有的线程按照同样的顺序获得一组锁。将多个锁组成一组并放到同一个锁下。将那些不会阻塞的可获得资源用变量标志出来。
public classDeadLockThread implements Runnable {
Stringname;
staticObject Chopsticksone =new Object();// 第一个筷子的锁对象
staticObject Chopstickstwo =new Object();// 第二个筷子的锁对象
publicDeadLockThread(String name) {
this.name= name;
}
publicvoid run() {
if("Lq".equals(name)) {
synchronized(Chopsticksone) {//Chopsticksone锁对象上的同步代码块
System.out.println(name+ "拿到第一个筷子");
synchronized(Chopstickstwo) {//Chopstickstwo锁对象上的同步代码块
System.out.println(name+ "拿到第二个筷子");
}
}
}else {
synchronized(Chopstickstwo) {
System.out.println(name+ "拿到第二个筷子");
synchronized(Chopsticksone) {
System.out.println(name+ "拿到第一个筷子");
}
}
}
}
publicstatic void main(String[] args) {
DeadLockThreadd1 = new DeadLockThread("Lq");
newThread(d1).start();
DeadLockThreadd2 = new DeadLockThread("hs");
newThread(d2).start();
}
}
9.单例模式(恶汉,懒汉)
public static Singleton getInstance2() {
return instance2;
}
private static Singletoninstance;
public static Singleton getInstance() {
if (instance ==null) {
synchronized (Singleton.class) {
if (instance ==null) {
instance = new Singleton();
}
}
}
return instance;
}