多线程总结

时间:2020-07-13 00:53:21   收藏:0   阅读:75

多线程

基本概念

程序、进程、线程

程序

进程

程序与进程区别

线程

并行与并发

总结

重要

线程的创建

继承于Thread类

class Mythread1 extends Thread {
    //重写run方法
    @Override
    public void run() {
        super.run();
        for (int i = 0; i < 10 ; i++) {
            if(i%2==0){
                try {
                  	//线程睡眠
                    sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}

实现Runnable接口

class Mythread2 implements Runnable{
		//重写run方法
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName()+i);
        }
    }
}

使用Callable和Future

//创建一个实现Callable的实现类
class ThreadCall implements Callable{
    //重写call方法,将需要执行的操作声明在call方法中
    @Override
    public Object call() throws Exception {
        int sum = 0;
        for (int i = 0; i <= 100; i++) {
            if (i % 2 == 0) {
                System.out.println(i);
                sum += i;
            }
        }
        return sum;
    }
}

通过线程池创建线程

class NumberThread implements Runnable{
    @Override
    public void run() {
        for(int i = 0;i <= 100;i++){
            if(i % 2 == 0){
                System.out.println(Thread.currentThread().getName() + ": " + i);
            }
        }
    }
}
public class ThreadPool {
    public static void main(String[] args) {
        //提供指定线程数量的线程池
        ExecutorService service = Executors.newFixedThreadPool(10);
      	//new NumberThread() 可以理解为是一个任务到来。
        service.execute(new NumberThread());
        service.shutdown();
    }
}

统一测试

  public static void main(String[] args) {
    //***********************************************************************//
        Mythread1 mythread = new Mythread1();
        System.out.println(Mythread1.currentThread().getName());
        mythread.setName("我是子线程!");
        System.out.println(Mythread1.currentThread().getName());
        //通过此对象调用start():①启动当前线程 ② 调用当前线程的run()
        mythread.start();
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                System.out.println(Thread.currentThread().getName() + ":" + Thread.currentThread().getPriority() + ":" + i);
            }
            if(i==20){
                try {
   //在线程a中调用线程b的join(),此时线程a就进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态。
                    mythread.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        System.out.println(Thread.currentThread().getName()+":=======hello");
    
	//***********************************************************************//
        //创建实现类的对象
        Mythread2 mythread2 = new Mythread2();
        //将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
        Thread thread2 = new Thread(mythread2);
        thread2.setName("我是实现方式的线程1:");
        thread2.start();

        Thread thread3 = new Thread(mythread2);
        thread3.setName("我是实现方式的线程2:");
        thread3.start();
    
  //***********************************************************************//
         //创建Callable接口的实现类对象
        ThreadCall threadCall = new ThreadCall();
        //传递到FutureTask构造器中,创建FutureTask的对象
        FutureTask futureTask = new FutureTask(threadCall);
        new Thread(futureTask).start();
        try {
            Object sum = futureTask.get();
            System.out.println("总和为:" + sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

生命周期

状态

/**
 * NEW:新建状态。在创建完 Thread ,还没执行 start() 之前,线程的状态一直是 NEW。可以说这个时候还没有真正的一个线程映射着,只是一个对象。
 *
 * RUNNABLE:运行状态。线程对象调用 start() 之后,就进入 RUNNABLE 状态,该状态说明在 JVM 中有一个真实的线程存在。
 *
 * BLOCKED:阻塞状态。线程在等待锁的释放,也就是等待获取 monitor 锁。
 *
 * WAITING:等待状态。线程在这个状态的时候,不会被分配 CPU,而且需要被显示地唤醒,否则会一直等待下去。
 *
 * TIMED_WAITING:超时等待状态。这个状态的线程也一样不会被分配 CPU,但是它不会无限等待下去,有时间限制,时间一到就停止等待。
 *
 * TERMINATED:终止状态。线程执行完成结束,但不代表这个对象已经没有了,对象可能还是存在的,只是线程不存在了。
 */
public enum State {
        NEW,
        RUNNABLE,
        BLOCKED,
        WAITING,
        TIMED_WAITING,
        TERMINATED;
    }

状态的转换

技术分享图片

线程的同步

问题提出

使用同步机制

同步监视器即锁
锁的操作

Lock锁

//使用lock来解决线程安全问题
class A{
	private final ReentrantLock lock = new ReenTrantLock();
	public void m(){
			lock.lock();
			try{
				//用来保证线程安全的代码;
			}
			finally{
			lock.unlock(); 
			}
		}
}

线程的通信

方法wait() 与 notify() 和 notifyAll()

注意

区别

原创不易,欢迎转载,转载时请注明出处,谢谢!
作者:潇~萧下
原文链接:https://www.cnblogs.com/manongxiao/p/13290580.html

原文:https://www.cnblogs.com/manongxiao/p/13290580.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!