2

1.1并行和并发
并发:指两个事情在这个时间内一个一个的做。
并行:指一个时间内同时做多个事情。
总结:并发是有顺序的,并行是做多个事情。
1.2创建多线程
//继承Thread类来创建线程

public class ThreadTest {
    public static void main(String[] args) {
        //设置线程名字
        Thread.currentThread().setName("六尘一");
        MyThread myThread = new MyThread();
        myThread.setName("新的线程:");
        //开启线程
        myThread.start();
        for(int i = 0;i<10;i++){
            System.out.println(Thread.currentThread().getName() + i);
        }
    }
}
class MyThread extends Thread{
    //重写run()方法
    public void run(){
        for(int i = 0;i < 10; i++){
            System.out.println(Thread.currentThread().getName() + i);
        }
    }
}

会循环10个六尘一
总结:继承了Thread就没办法继承其它类了。
1.3:Thread接口与Runnble类的区别:
Runnnble可以使用共同资源。
线程池只能放入实现Runable接口或Callable类线程,不能直接放入继承Thread的类。

1.4线程和进程:
一个程序就是一个进程,而一个程序中的多个任务则被称为线程。
1.5线程安全:

package com.kjzz.Runnable;

public class Aicket implements Runnable{
    private int ticket = 100;

    /*
     * 执行卖票操作
     */
    @Override
    public void run() {
        //每个窗口卖票的操作
        //窗口 永远开启
        while (true) {
            if (ticket > 0) {//有票 可以卖
              
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto‐generated catch block
                    e.printStackTrace();
                }
                //获取当前线程对象的名字
                String name = Thread.currentThread().getName();
                System.out.println(name + "正在卖:" + ticket);
            }
        }
    }
}

package com.kjzz;

import com.kjzz.Runnable.Aicket;

public class Demo01 {
    public static void main(String[] args) {
        Aicket t = new Aicket();
        Thread thread = new Thread((Runnable) t,"窗口1");
        Thread thread1= new Thread((Runnable) t,"窗口2");
        Thread thread2 = new Thread((Runnable) t,"窗口3");
        thread.start();
        thread1.start();
        thread2.start();
    }
}

image.png
这里出现了不该有的票,比如-1和0要怎么解决呢,出现这种情况显然表明这个方法根本就不是线程安全的,出现这种问题的原因有很多
需要用到lock锁

package com.kjzz.Runnable;


import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Ticket implements Runnable {

    private int ticket = 10;
    Lock lock = new ReentrantLock();
    /*
     * 执行卖票操作
     */
    @Override
    public void run() {
        while(true){
           lock.lock();
            if(ticket>0){
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //获取当前线程对象的名字
                String name = Thread.currentThread().getName();
                System.out.println(name+"正在卖:"+ticket--);
            }
            lock.unlock();
        }
        }
    }

打了个lock锁就不会出现这种情况呢


陈礼浩
4 声望4 粉丝

« 上一篇
水仙花数
下一篇 »
mySQL多表联查