JAVA_SE基础知识——多线程以及线程池的使用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43841301/article/details/101062432

1、进程与线程

进程第指在系统中正在运行的一个应用程序,线程是比进程更小的执行单位
一个进程可以产生多个线程,多线程机制使程序运行效率变得更高

多线程好处:解决了多部分代码同时运行的问题
多线程弊端:线程太多,单个线程运行效率降低

2、多线程实现的方式:

a、继承Thread类----本身是线程资源还是个线程
	1、子类重写父类中的run方法,将线程运行的代码存放在run中
	2、建立子类对象的同时线程也被创建
	3、通过调用start方法开启线程
	  start方法调用线程,run执行线程代码
	4、子类重写Thread的run方法
	
	eg:ThreadDemo th=new ThreadDemo("nana");
	    th.start();

	一个线程类对象只能调用一次线程。

b、实现Runnable 接口----本身是线程资源不是线程
	1、子类覆盖接口中的run方法
	2、通过Thread类创建线程,并将实现了Runnable接口的子类对象作为参数
	   传递给Thread类的构造函数
	3、Thread类对象调用start方法开启线程
	eg:ThreadDemo2 td = new ThreadDemo2();
	    new Thread(td).start();
	    new Thread(td).start();

    两种方式的区别:继承Thread类受单继承影响,不适合多个线程共享资源
		实现Runnable接口方便资源共享

c、实现Callable接口通过FutureTask包装器来创建Thread线程

d-线程池
    eg:ThreadDemo td=new ThreadDemo();
	ExecutorService es=Executors.newFixedThreadPool(3);//创建线程池,池里有3个线程
	es.execute(td);//调用线程

3、线程的四种状态

被创建(就绪)
运行
冻结
消亡

sleep方法需要指定睡眠时间,单位是毫秒
wait()方法需要被notify()方法唤醒

4、线程操作方法

public static Thread currentThread();//返回当前线程
public final String getName();//返回当前线程名称
public final void setPriority(int priority);//设置线程优先级
	提高线程抢占CPU资源的可能性(1,5,10),但是并不代表一定可以抢到
public void start();//开始执行线程
public static void sleep(long m);//使用目前的线程休眠 
public final void yield();//线程的礼让,暂定当前线程,让其他线程先运行
public void run();//执行线程

5、Object是所有类的祖先,包含以下对线程操作相关的方法

public final void wait();//线程等待
public final void wait(long timeout);//线程等待,并指定等待时间
public void notify();//唤醒第一个等待的线程
public void notifyAll();//唤醒全部等待的线程

6、线程同步

同步:在同一时间段内只能运行一个线程。可以解决线程中的安全问题
前提:同步需要两个或者两个以上的线程
      多个线程使用的是同一个资源
未满足上述两个条件不能成为同步

同步的弊端:当线程相当多时,因为每个线程都会去判断同步上的锁,这
	是很耗费资源的,无形中会降低程序运行的效率

线程同步:同步代码块、同步方法
	同步代码块:synchronized(同步对象 类名.class){ 需要同步的代码 }
		synchronized锁住的是括号里的对象,而不是代码。
		eg:synchronized (TickedSell2.class) {
			if (t>0) {
				System.out.println("票号"+t--);
			}	
		     }

同步方法:把代码块做成方法,然后再调用

7、线程死锁:

彼此占用对方所需要的资源,双方进行不下去

8、常用的线程池使用方法

public static ExecutorService newFixedThreadPool(int nThreads) 
创建固定数目线程的线程池。

public static ExecutorService newCachedThreadPool() 
创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。


public static ExecutorService newSingleThreadExecutor() 
创建一个单线程化的Executor。
public static 

ScheduledExecutorService newScheduledThreadPool(int 
corePoolSize) 
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

猜你喜欢

转载自blog.csdn.net/weixin_43841301/article/details/101062432