多线程


多线程

我们先来说说进程和线程,什么是进程?



图上就是进程,你会发现我的电脑运行多个进程


1.线程永远要依附于进程存在,在每个进程上可以继续划分出若干个线程,

2.线程的操作一定是要比进程更快,

小点:所有的线程都是交替执行,本身是没有固定的执行顺序的

说了那么多,直接上图

-----------------------------------------------------------------------分割线--------------------------------------------------------------------------


由于线程的启动需要牵扯到操作系统中资源的分配问题,所以具体的线程的启动应该要
根据不同的操作系统有不同的实现,而JVM相当于根据系统中定义的start0()方法来根据不同的操作系统进行该方法的实现,这样在多线程的层次上start0()方法名称不改变,而不同的操作系统上有不同的实现。

结论:只有Thread类的start()方法才能够进行操作系统的资源分配,所以启动多线程的方式永远就是调用Thread类的Start()方法实现。                                             
继承Thread类会产生单继承的局限操作,所以现在最好的做好是利用接口来解决问题,于是就可以Runnable接口来完成操作。

-----------------------------------------------------------------------分割线--------------------------------------------------------------------------



三种实现方式

第一种:Thread实现,,直接上代码




第二种:Runnable接口实现




第三种:实现Callable接口


从JDK1.5之后对于多线程的实现多了一个callable接口。在这个接口里面比Runnable接口唯一的强大之处在于它可以返回执行结果。此接口定义在Java.util.concurrent包中定义。

@FunctionalInterface

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_PRIORIT5
最低优先级: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 缺点欢迎指出!

 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值