了解线程

Posted liu-chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了了解线程相关的知识,希望对你有一定的参考价值。

1. 多任务、进程、线程是什么?

  • 当你再pc上边听歌边写博客,还挂着qq,你已经在使用多任务了。cpu会分配给不同每个应用不同的时间片,它们其实是在后台轮流执行,时间短,看着就像在同时运行一样。
  • 进程就是ctrl+alt+. 打开任务管理器之后就能看到了,一个进程由很多个线程组成;
  • 线程就是组成程序执行的最小单位了。

2. 单线程程序与多线程程序

  • 单线程程序:你必须在听歌的时候关闭qq,不能写博客。
  • 多线程程序:同时执行多个程序

3.创建线程

  • 继承Thread类<也实现了Runnable接口>
  • 实现Runnable接口(较多使用)

4.创建第一个线程

class MyThread extends Thread{
    public MyThread(String name){
        super(name);
    }
    @Override
    public void run() {
        for(int i=0;i<10;i++){
            System.out.println(getName()+"启动了!"); //run()里放的就是该线程要做的事情,可以被多个线程共享,就是说线程1可以去执行run
        }
    }
}
public class ThreadDemo  {

    public static void main(String[] args) {
        MyThread myThread=new MyThread("线程1");
        MyThread myThread1=new MyThread("线程2");
        myThread.start();//jVM会去调用run方法
        myThread1.start();
    }
}

通过多执行几次代码发现,线程的执行顺序是随机的,结果并不唯一。

5.使用Runnable接口创建线程

class MyThread1 implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"运行了");
    }
}
public class RunnableTest {
    public static void main(String[] args) {
        MyThread1 myThread1=new MyThread1();
        Thread thread=new Thread(myThread1,"线程run");
        thread.start();        //还是通过构造Thread对象来调用start()
    }
}
//对start()的解释
   Causes this thread to begin execution; the Java Virtual Machine * calls the
<code>run</code> method of this thread. * <p> * The result is that two threads are running concurrently: the * current thread (which returns from the call to the * <code>start</code> method) and the other thread (which executes its * <code>run</code> method). * <p> * It is never legal to start a thread more than once. * In particular, a thread may not be restarted once it has completed execution.
线程开始执行,jvm会调用线程中的run()。
结果是两个线程同时执行:当前的线程(调用start()返回的线程)和其他线程(执行run())
一个线程多次start是不合法的。通常情况下一个线程完整执行完后不会再次start

 6.线程状态及生命周期

技术图片

7. sleep()  和  join()

        sleep():app的定期刷新,定时执行。俗称:休眠

  join():要等调用该方法的线程执行完成后,才能执行。俗称:插队

8. 线程的优先级  

Note:线程什么时候运行是不确定的,即使设置了优先级,影响线程启动的因素很多,导致线程还是随机启动的

//两种设置优先级的方式
thread.setPriority(10);thread.setPriority(Thread.MAX_PRIORITY);
//获取优先级
thread.getPriority(

9.线程同步

 问题:在前面我们知道,线程的启动和停止总是随机的,不可预测。

 模拟银行取款为例,存款为一个线程,取款为一个线程。比如账户有100元,现存进去100,有200了,再取50,剩150。

可能出现的问题是在你执行存款方法的时候,还没执行到保存的方法,线程就被取款线程取代,结果就是,账户就剩50元。

关键字

  见另一篇博客:

10 线程间的通信

wait()、死锁,notify():唤醒等待的线程,notifyAll()

以上是关于了解线程的主要内容,如果未能解决你的问题,请参考以下文章

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

多线程 Thread 线程同步 synchronized

活动到片段方法调用带有进度条的线程

多个用户访问同一段代码

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

RunLoop总结:RunLoop的应用场景