多线程

本文深入探讨了多线程的基本概念与实现方式,包括线程的类型、静态方法及对象方法等,并通过实例讲解了如何解决线程安全问题与死锁问题。

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(); //优先级[110](默认值为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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值