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类。