线程的优先级

每一个Java线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。
Java线程的优先级是一个整数,其取值范围是1(Thread.MIN_PRIORITY ) -10 (Thread.MAX_PRIORITY ).默认情况下,每一个线程都会分配一个优先级NORM_PRIORITY (5)。
具有较高优先级的线程对程序更重要,并且应该在低优先级的线程之前分配处理器资源。但是,线程优先级不能保证线程执行的顺序,而且非常依赖于平台。

创建一个线程

Java提供了三种创建线程的方法:
通过实现 Runnable 接口;通过继承Thread类本身;
通过Callable和 Future创建线程。

通过实现 Runnable接口来创建线程

创建一个线程,最简单的方法是创建一个实现 Runnable接口的类。为了实现Runnable,一个类只需要执行一个方法调用run(),声明如下:
public void run()
你可以重写该方法,重要的是理解的run()可以调用其他方法,使用其他类,并声明变量,就像主线程一样。在创建一个实现 Runnable接口的类之后,你可以在类中实例化一个线程对象。
Thread定义了几个构造方法,下面的这个是我们经常使用的:
Thread(Runnable threadob , String threadName ) ;
这里,threadOb是一个实现Runnable接口的类的实例,并且threadName 指定新线程的名字。新线程创建之后,你调用它的start()方法它才会运行。
void start();

通过继承Thread来创建线程

创建一个线程的第二种方法是创建一个新的类,该类继承Thread类,然后创建一个该类的实例。继承类必须重写run()方法,该方法是新线程的入口点。它也必须调用start()方法才能执行。该方法尽管被列为一种多线程实现方式,但是本质上也是实现了Runnable 接口的一个实例。

Thread方法

public void start()

  使该线程开始执行;Java虚拟机调用该线程的run方法。
public void run()

  如果该线程是使用独立的Runnable 运行对象构造的,则调用该Runnable对象的run方法;否则,该方法不执行任何操作并返回。
public final void setName(String name)

  改变线程名称,使之与参数name 相同。
public final void setPriority(int priority)

  更改线程的优先级。
public final void setDaemon(boolean on)

  将该线程标记为守护线程或用户线程。
public final void join(long millisec)

  等待该线程终止的时间最长为millis毫秒。
public void interrupt()

  中断线程。
public final boolean isAlive()

  测试线程是否处于活动状态。

通过callable 和Future 创建线程
1.创建Callable 接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
⒉.创建Callable 实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的cal()方法的返回值。
3.使用FutureTask对象作为Thread对象的 target 创建并启动新线程。
4.调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

创建线程的三种方式的对比

1.采用实现Runnable、Callable接口的方式创建多线程时,线程类只是实现了Runnable接口或Callable 接口,还可以继承其他类。
⒉使用继承Thread类的方式创建多线程时,编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

在多线程编程时,主要概念:线程同步,线程间通信,线程死锁,线程控制:挂起、停止和恢复

多线程的使用
有效利用多线程的关键是理解程序是并发执行而不是串行执行的。

(并发是指多个线程轮流执行〈单核CPU) ;并行是指多个线程同时执行(多核CPU),微观上是同时的;串行是指一个一个的执行,处理完一个才能处理下一个,不轮换;)

例如:程序中有两个子系统需要并发执行,这时候就需要利用多钱程编程。通过对多线程的使用,可以编写出非常高效的程序。不过请注意,如果你创建太多的线程,程序执行的效率实际上是降低了,而不是提升了。请记住,上下文的切换开销也很重要,如果你创建了太多的线程,CPU花费在上下文的切换的时间将多于执行程序的时间!

最新文章

  1. 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~
  2. C和指针 第四章 习题
  3. test hypertext links for validity, accessibility, and recent modification
  4. 15款优雅的 WordPress 电子商务网站主题
  5. Leetcode 132. Palindrome Partitioning II
  6. test1
  7. 1293: [SCOI2009]生日礼物 - BZOJ
  8. 【Hadoop代码笔记】Hadoop作业提交之客户端作业提交
  9. laravel中StartSession中间件的问题
  10. 100% width CSS 在 iPad / iPhone Safari 背景被截断 / 显示不全
  11. live555—VS2010/VS2013 下live555编译、使用及测试(转载)
  12. 转: Executor类
  13. java 对象的序列化与反序列化
  14. tensorflow分布式训练
  15. 基于javaMail的邮件发送--excel作为附件
  16. GET和POST两种请求方法的区别(RFC翻译)
  17. Mysql 数据库安装与配置详解
  18. Deep Dream 模型
  19. Scrutiny of Partner's individual project Code
  20. LeetCode--155--最小栈(java版)

热门文章

  1. python文件读写及修改
  2. Ubuntu 16.04 菜单栏 换位置 挪到左边 挪到下边
  3. C#写TXT文档
  4. 正则表达式之grep
  5. oracle 修改表空间名
  6. IDEA插件和个性化配置推荐
  7. 如何用LOTO示波器安全的测量高电压?
  8. Fiddler抓包工具简介:(三)手机端代理配置
  9. K8S发布策略,无损发布
  10. 浏览器调用接口正常,jmeter调不通的可能原因