Java线程学习笔记(一个)
一个、正在创建的线程:
老掉牙的话题了。继承 java.lang.Thread父类或者实现Runnalbe接口。这里就提一句:
class Thread implements Runnable
Thread也是继承了Runnable接口的,Runnable才是大哥。
重写run(),run()里放的都是详细的业务,包含对线程的详细操作。
class Thread1 implements Runnable {
int i;
Thread1(int i) {
this.i = i;
}
@Override
public void run() {
long x = new Random().nextInt(10)*1000;
try {
Thread.sleep(x);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
System.out.println("线程"+ i + "睡眠" + x);
}
}
二、线程的调用:
独立的线程启动方式—Thread的start()方式,
class Thread1Execute {
public static void main(String[] args) {
// 创建线程
Thread thread = new Thread(new Thread1(99));
// 启动命令
thread.start();
}
}
线程池启动 ExecutorService
public class SleepTest1 {
public static void main(String[] args) {
// 创建线程池,这里用了向上造型。事实上newCachedThreadPool出来的类是ThreadPoolExecutor。
ExecutorService executor = Executors.newCachedThreadPool();
for (int i=0;i<10 ; i++) {
// 运行10个线程
executor.execute(new Thread1(i));
}
//关闭线程池
executor.shutdown();
}
}
三、线程优先级:
线程里设置优先级。JDK里有10个优先级,但JDK得优先级与操作系统兼容的并不好,因此,在编程的时候。仅仅是用三个优先级
/**
* The minimum priority that a thread can have.
*/
public final static int MIN_PRIORITY = 1; /**
* The default priority that is assigned to a thread.
*/
public final static int NORM_PRIORITY = 5; /**
* The maximum priority that a thread can have.
*/
public final static int MAX_PRIORITY = 10;</span>
设置优先级的代码要放到run()的开头部分。
public void run() {
// 设置优先级为最高。
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
四、让步Thread.yield()
yield()方法仅仅只是是一个暗示,不能保证它被採用。因此。在对重要的线程进行控制的时候,慎用。
五、后台线程
后台线程也叫守护线程,顾名思义就是在后台跑的线程,不会因正常线程的结束而结束。
设置方法为,在线程启动之前,thread.setDaemon(true);
由于Thread默认的daemon是false,參照代码例如以下:
/* Whether or not the thread is a daemon thread. */
private boolean daemon = false;
代码演示样例:
class Thread1Execute {
public static void main(String[] args) throws InterruptedException {
for (int i=0;i<10 ; i++) {
// 创建线程
Thread thread = new Thread(new Thread1(i));
thread.setDaemon(true);
// 启动命令
thread.start();
}
System.out.println("main睡眠");
Thread.sleep(10000);
System.out.println("main醒来");
}
}
输出结果为:
main睡眠
线程6睡眠2000
线程8睡眠2000
线程3睡眠3000
线程7睡眠4000
线程1睡眠5000
线程0睡眠5000
线程9睡眠5000
线程5睡眠7000
线程4睡眠8000
线程2睡眠8000
main醒来
能够看出,后台进程不受Main线程的控制。在main睡眠期间,他们依旧辛劳耕种。
但当最后一个非后台线程退出时,后台线程会“突然”终止,也就是说一旦main()退出。JVM将关闭全部后台线程。
因此,这样的后台线程并不好控制。不推荐在实际项目中使用。
另一种线程池的创建后台进程的方式。这样的方式略微有那么一点点复杂
Executors.newCachedThreadPool(new DaemonThreadFactory());这里须要传入一个线程工厂。
public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newCachedThreadPool(new DaemonThreadFactory());
for(int i = 0; i < 10; i++)
exec.execute(new DaemonFromFactory());
System.out.println("All daemons started");
TimeUnit.MILLISECONDS.sleep(500); // Run for a while
}
工厂的定义例如以下,作用为将全部创建出来的线程都设置为Daemon后台线程类型。
class DaemonThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
}
这样的灵感来源于java.util.concurrent.Executors的默认线程工厂。
/**
* The default thread factory
*/
static class DefaultThreadFactory implements ThreadFactory {
static final AtomicInteger poolNumber = new AtomicInteger(1);
final ThreadGroup group;
final AtomicInteger threadNumber = new AtomicInteger(1);
final String namePrefix; DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null)? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
namePrefix = "pool-" +
poolNumber.getAndIncrement() +
"-thread-";
} public Thread newThread(Runnable r) {
Thread t = new Thread(group, r,
namePrefix + threadNumber.getAndIncrement(),
0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
先讲这么多,线程这块的东西实在是太多了,理解起来也很难。
有那么一本书推荐一下《JAVA并发编程实践》这本书是专门讲并发的,我打算下个月就開始写那本书的阅读日记,当然还有传说中的《Head first设计模式》。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Java线程学习笔记(一个)的更多相关文章
- Java 线程学习笔记
1.什么是线程 进程: 一个正在运行的程序就叫一个进程. 每个进程都有独立的内存空间. (进程是资源分派的基本单位) 线程: 一个进程中可以有很多线程.----> 常说的多线程 线程没有独立的内 ...
- Java线程学习笔记(两) 线程异常处理
线程捕获异常: 情况下,我们在main()方法里是捕捉不到线程的异常的,比例如以下面代码: public class ExceptionThread implements Runnable{ @Ove ...
- 学习java线程学习笔记
线程:代码执行的一个分支 主要作用是提高了效率,cpu能同时执行多个部分的代码. 线程的创建:两种方式 a.继承于thread类,重写run方法. b. ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Android(java)学习笔记211:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Android(java)学习笔记219:开发一个多界面的应用程序之两种意图
1.两种意图: (1)显式意图: 在代码里面用intent设置要开启Activity的字节码.class文件: (2)隐式意图: Android(java)学习笔记218:开发一个多界面的应用程序之人 ...
- Android(java)学习笔记162:开发一个多界面的应用程序之两种意图
1.两种意图: (1)显式意图: 在代码里面用intent设置要开启Activity的字节码.class文件: (2)隐式意图: Android(java)学习笔记218:开发一个多界面的应用程序之人 ...
- 20145213《Java程序设计学习笔记》第六周学习总结
20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
随机推荐
- python实现了字符串的按位异或和php中的strpad函数
近期在写自己主动化測试,因为开发加密中用到strpad和字符串的按位异或,而python中没有这种函数和功能,所以必须自己写一套,要不自己主动化測试无法进行,所以就用python实现了一下,因为在写字 ...
- H3C低端交换机MAC绑定
1.MAC地址和端口的绑定<h3c>system[h3c]interface e0/1[h3c-interface]mac-address max-count #关闭交换机端口的MAC学习 ...
- ZOJ3626(树形dp)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4772 题意:给一棵有n个结点的树,每个点有点权表示在这个点上的价值, ...
- Android 通过调用系统,如接口 谷歌语音、百度语音、科大讯飞语音等语音识别方法对话框
现在app在发展过程中会集成一些语音识别功能,不具有其自己的显影剂一般正在开发的语音识别引擎,所以在大多数情况下,它是选择一个成熟的语音识别引擎SDK集成到他们的app在. 平时,这种整合被分成两个, ...
- 【Oracle】-【sqlplus / as sysdba登录报错问题】-新用户使用sqlplus / as sysdba登录报错
刚才打开一个别人的测试库,用root登陆了的,sqlplus / as sysdba竟然报错,奇怪,于是在自己的VM中模拟该过程. 新建了一个test用户: [test@liu bin]# ./sql ...
- vb.net版机房收费——助你学会七层架构(一)
我自己写机房的时候,看非常多高人的博客,各种的借鉴,当初务必的纠结,如今整个机房敲完了,写这篇博客给大家一个总体上的.简单理解的七层,期望大家看完这篇文章之后,不会这个纠结了. 首先大家得看了我的上一 ...
- dede 标签
◆织梦内容管理系统模板标签代码参考 [Arclist 标记] 这个标记是DedeCms最常用的一个标记,也叫自由列表标记,其中 hotart.coolart.likeart.artlist.imgl ...
- WPF中不规则窗体与WebBrowser控件的兼容问题解决办法
原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法 引言 这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序. ...
- MYSQL中取当前年份的第一天和当前周,月,季度的第一天/最后一天
mysql 获取当年第一天的年月日格式:SELECT DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY); MySQL里获取当前week.month ...
- Windows Phone开发(47):轻松调用Web Service
原文:Windows Phone开发(47):轻松调用Web Service 众所周知(除了没用过VS的),在VS里面调用Web Service是一件很愉快的事情,不解释,相信很多朋友在以前的项目中肯 ...