Java多线程

Posted 小田mas

tags:

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

Java多线程

JavaThread

多任务–>多线程

期望变成下图所示。

进程process与Thread


先后顺序是不能人为干预的。
同时,线程会带来额外的开销。
垃圾回收线程gc进程。

线程的创建

三种方式:

callable在工作3-5年之后在进行了解。

  1. 继承Thread,重写run方法。
public class  TestThread extends Thread
	public void run()
	//run方法线程体
		for(int i=0;i<20;i++)
			System.out.println("我在看代码");
		
	
	public static void main(String[] args)
		//main线程,主线程
		TestThread tt = new TestThread();
		tt.start();

		for(int i=0;i<20;i++)
			System.out.println("我在学多线程");
		
	

注意线程开启不一定立即执行,由cpu调度执行,线程并行交替执行。
调用的是start,注意!!!
2.

实现Runnable接口



代理,需要创建一个线程对象,然后通过线程对象来开启线程。

两者的区别


由于java 是单继承,所以推荐使用Runnable接口。
Thread修改之后实现Runnable接口

小结

package caculator;

public class TestThread1 implements Runnable

    private  int ticketnum = 10;
    @Override
    public void run() 
        while(true)
            if(ticketnum<0)
                break;
            try 
                Thread.sleep(200);
             catch (InterruptedException e) 
                e.printStackTrace();
            
            System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticketnum--+"张票");
        
    

    public static void main(String[] args) 
        TestThread1 ticket = new TestThread1();

        new Thread(ticket,"小明").start();
        new Thread(ticket,"小米").start();
        new Thread(ticket,"妞妞").start();
    


龟兔赛跑


线程创建方式3实现callable接口。


  1. 首先实现callable接口,需要有一个返回值,<>
  2. 重写call方法
  3. new类时有所不同
    固定大小的线程池。

    new了1个池子,这个池子里有3线程。

    callable
    可以定义返回值,可以抛出异常。

静态代理

真实对象和代理对象都要实现同一个接口,代理对象要代理真实角色。
通过代理角色替真实角色完成一些事。
好处:真实对象可以专注做自己的事情,而代理对象可以做很多真实对象做不了的事情。

可以将以下两个对比来看

thread代理runnable,实现start方法。
静态代理就是线程底部的实现方法。

lamda表达式




包含静态内部类的知识。

局部内部类

匿名内部类

没有类的名称,必须借助接口或者父类。但是前面还是需要加上ILike
最终采用lambda简化。

有参lambda实现

lambda表达式的简化,

去掉花括号的原因是因为代码只有一行,多行就不可以。
去掉括号的原因是前提是接口是函数式接口。
多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号,(a,b)。

线程状态


线程方法


@Deprecated,代表这个方法已经不建议使用了。


模拟网络延时,可以放大问题的发生性。


礼让不一定成功,要看cpu的心情。
Thread.currentThread.getName();





死亡之后的线程就不能再次启动了。
getstate();

线程优先级

相应的maxpriority和minpriority都对应相应的数字。

优先级要提前设定,然后再用start调度。
如果优先级低的先执行了,就会导致性能倒置。

daemon


每个对象都有一把锁。


线程同步方法



sychronized默认锁的是this,所以不太对,但是run里面有可能操作的对象不是this。此时只锁一个方法并不能达到理想的效果,所以这个时候出现了同步块。

用法可以参考以下的代码

锁的对象就是变化的量,即需要增删改的量。

测试JUC安全类型的集合。
CopyOnWriteArrayList本身就是安全的。


互斥互斥的实现。

解决互斥


操作系统有没有。

使用方法:


sychronized与lock的对比

lock是代码块锁。

ReetrantLock。







以上就是管城法。





线程池




总结


以上是进程的创建。

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

Java 线程池 8 大拒绝策略,面试必问!

Java多线程案例之线程池

多线程(线程池原理)

java LimitedThreadPool

高级java必会系列一:多线程的简单使用

线程池与Python中的GIL