多线程
图上就是进程,你会发现我的电脑运行多个进程
1.线程永远要依附于进程存在,在每个进程上可以继续划分出若干个线程,
2.线程的操作一定是要比进程更快,
小点:所有的线程都是交替执行,本身是没有固定的执行顺序的
(说了那么多,直接上图)
-----------------------------------------------------------------------分割线--------------------------------------------------------------------------
由于线程的启动需要牵扯到操作系统中资源的分配问题,所以具体的线程的启动应该要
根据不同的操作系统有不同的实现,而JVM相当于根据系统中定义的start0()方法来根据不同的操作系统进行该方法的实现,这样在多线程的层次上start0()方法名称不改变,而不同的操作系统上有不同的实现。
结论:只有Thread类的start()方法才能够进行操作系统的资源分配,所以启动多线程的方式永远就是调用Thread类的Start()方法实现。
继承Thread类会产生单继承的局限操作,所以现在最好的做好是利用接口来解决问题,于是就可以Runnable接口来完成操作。
-----------------------------------------------------------------------分割线--------------------------------------------------------------------------
三种实现方式
第一种:Thread实现,,直接上代码
第二种:Runnable接口实现
第三种:实现Callable接口
从JDK1.5之后对于多线程的实现多了一个callable接口。在这个接口里面比Runnable接口唯一的强大之处在于它可以返回执行结果。此接口定义在Java.util.concurrent包中定义。
public interface Callable<V>{
public V call()throws Exception
)
这个泛型表示的是返回值类型。Call()方法就相当于run()方法。
-----------------------------------------------------------------------分割线--------------------------------------------------------------------------
总结:Thread有单继承局限 所以不使用,但是所有的线程对象一定要通过Thread里中的start()方法启动。
Runnable使用时可以避免单继承局限,所以建议使用此操作。
Callable比Runnable唯一的好处是多了返回值的数据。
-----------------------------------------------------------------------分割线--------------------------------------------------------------------------
构造方法:public Thread(Runnable target,String name)
设置名字:public final void setName(String name)
取得名字:public final String getName()
//MyThread线程类:main (mt.run();)
//MyThread线程类:Thread-0 (newThread(mt).start();)
每当使用Java命令在JVM上解释某一个程序执行的时候,那么都会默认的启动一个JVM的进程,而主方法只是这进程中的一个线程,所以整个程序一直都在跑在线程的运行机制上。
每一个JVM至少会启动两个线程:主线程(main),GC线程
-----------------------------------------------------------------------分割线--------------------------------------------------------------------------线程的休眠:
休眠方法:
publicstatic void sleep(long millis)throws InterruptedException
如果休眠的时间没到,就停止休眠了,那么就会产生中断异常
------------------------------------------------------------------------分割线-------------------------------------------------------------------------
线程的优先级
从理论上来讲 优先级越高的线程越有可能执行
设置优先级:intpublic final getPriority()
而对于优先级一共定义三种:最高优先级:public static final int MAX_PRIORITY 10中等优先级: public static final int NORM_PRIORITY 5最低优先级:public static final int MIN_PRIORITY 1
System.out.println(Thread.currentThread().getPriority());
主线程属于中等优先级 5
总结:
1.线程要有名字:Thread.currentThread取得当前线程
2.线程的休眠是有先后顺序的
3.理论上线程的优先级越高越有可能先执行
------------------------------------------------分割线---------------------------------------------
线程同步的处理
如果要想在若干行代码上实现锁这个概念,那么就需要通过使用同步代码块或同步方法来解决
同步代码块:使用synchronized关键字定义的代码块就称为同步代码块,但是在进行同步的时候需要设
置有一个同步对象,那么往往可以 this同步当前对象。
在多个线程访问同一资源,一定要考虑到数据的同步问题,同步就使用synchronized
---------------------------------------分割线-----------------------------
死锁是一种不确定的状态,对于死锁的操作应该出现的越少越好,
代码不做任何实际
面试题:请问多个线程访问同一资源时可能带来什么问题?以及会产生什么样的附加问
题?
1.多个线程访问同一资源时必须要考虑同步,可以使用synchronized定义同步代码块或同步的
方法
2.程序中如果出现过多的同步那么就将产生死锁
总结:如果看见了synchronized声明的方法,一定要记住,这是一个同步方法,属于线程安全的操作,
性能不会特别的高
------------------------------------------------分割线---------------------------------------------
以上是本人在工作,学习之余的一点总结,(还是小白一枚)
当然还有很多不足,勿ping 缺点欢迎指出!