java学习之线程的操作方法
package com.gh.thread; /**
* 线程实现的两种方法
* 1、继承thread类
* 2、实现Runnable接口
* @author ganhang
*
*/
public class ThreadDemo { public static void main(String[] args) {
//第一种线程实现
Mythread mythread =new Mythread();
mythread.setName("自定义线程1");
mythread.start();
try {
Thread.sleep(2);//当前线程睡眠2毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
//第二种线程实现
Thread thread=new Thread(new Mythread2(),"自定义线程2");
thread.start();
}
} class Mythread extends Thread{
@Override
public void run() {
for (int i = 0; i < 3; i++) {
//输出当前线程的名字和i;
System.out.println(Thread.currentThread().getName()+"--"+i);
}
}
}
class Mythread2 implements Runnable{ @Override
public void run() {
for (int i = 0; i <3; i++) {
System.out.println(Thread.currentThread().getName()+"--"+i);
}
} }
线程的同步
package com.gh.thread;
/**
* 同步实现顺序上厕所,假设厕所只有一个
* 1、使用synchronized同步代码块
* 2、使用同步方法
* @author ganhang
*/
public class ThreadDemo1 {
public static void main(String[] args) {
Mythread5 my=new Mythread5();
//注意这里必须使用同一个Mythread类的对象,不然无法同步
Thread t1=new Thread(my,"小白");//线程1
Thread t2=new Thread(my,"小黑");//线程2
//两个线程同时跑
t1.start();//小白要上厕所
t2.start();//小黑也要上厕所
}
}
class Mythread5 implements Runnable{
@Override
public void run() {
//同步代码块
synchronized (this) {//锁定对象一次只能进一个个
System.out.println(Thread.currentThread().getName()+"正在上厕所。。");
try {
Thread.sleep(1000);//模拟**。。。耗时1s
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"上完了。。");
}
}
}
中断线程
package com.gh.thread; /**
* 中断线程
* 1、interrupt()方法
* 2、自定义标记完成中断
* @author ganhang
*
*/
public class ThreadDemo2 {
public static void demo1() {
Thread t1 = new Thread(new Mythread3(), "线程1");
t1.start();
for (int i = 0; i < 10; i++) {
if (i == 5)
t1.interrupt();//只是个标记中断不会真正中断,是否中断还是由线程自己决定
System.out.println("main-" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void demo2(){
Mythread4 my=new Mythread4();
Thread t1=new Thread(my,"线程2");
t1.start();
for(int i=0;i<10;i++){
if(i==5){
my.setFlag(true);//中断
}
System.out.println(Thread.currentThread().getName()+"--"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
demo1();//第一种方式实现
demo2();//第二种方式实现
}
} class Mythread4 implements Runnable {
private boolean flag = false; public boolean isFlag() {
return flag;
} public void setFlag(boolean flag) {
this.flag = flag;
} @Override
public void run() {
int i=0;
while (!flag) {
System.out.println(Thread.currentThread().getName() + "--" + i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
} class Mythread3 implements Runnable { public void run() {
int i = 0;
while (!Thread.interrupted()) {
System.out.println(Thread.currentThread().getName() + "--" + i++);
try {
Thread.sleep(1000);// sleep会清除interrupt状态
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}
}
java学习之线程的操作方法的更多相关文章
- Java学习笔记 线程池使用及详解
有点笨,参考了好几篇大佬们写的文章才整理出来的笔记.... 字面意思上解释,线程池就是装有线程的池,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程 ...
- 进阶Java编程(2)线程常用操作方法
线程常用操作方法 多线程的主要操作方法都在Thread类中定义的. 1,线程的命名和取得 多线程的运行状态是不确定的,那么在程序的开发之中为了可以获取到一些需要使用到的线程就只能依靠线程的名字来进行操 ...
- java学习之- 线程运行状态
标签(空格分隔): 线程运行状态 线程的运行状态: 如下是是我编写的一个图,大家可以作为参考: 1.new一个thread子类也是创建了一个线程: 2.创建完毕之后start()-----运行, 3. ...
- java学习之线程
一.线程总述: 线程是java当中一个重要的内容,如果想说线程的话,那我们应该先来讲一下什么是进程. 进程:那么什么是进程呢,进程从字面上来理解就是,正在进行的程序.就比如说我们在windows当中打 ...
- java学习之线程池的实现
package com.gh.threadpoor; import java.util.concurrent.ExecutorService; import java.util.concurrent. ...
- Java 学习笔记 线程控制
题目一 本质上来说,线程是不可控制的,线程的执行是由CPU资源分配决定的,我们无法干预系统CPU的资源分配,但我们可以增加条件来让线程按照我们的预想顺序来执行. 比如.如果当前的执行的线程不满足我们所 ...
- java学习之- 线程继承Thread类
标签(空格分隔): 线程 在java.lang包中有个Thread子类,大家可以自行查阅文档,及范例: 如何在自定义的代码中,自定义一个线程呢? 1.通过对api的查找,java已经提供了对线程这类事 ...
- Java学习:线程池
线程池 线程池概念:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多的资源. 线程池:容器-->集合(ArrayList,Hash ...
- Java学习:线程的安全问题
线程的安全问题 模拟卖票案例创建三个的线程,同时开启,对共享的票进行出售 public class RunnableImpl implementsc Runnable{ //定义一个多线程共享的票源 ...
随机推荐
- URAL 1297 Palindrome 后缀数组
D - Palindrome Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- Foundation 框架 NSArray、NSMutableArray排序
一.使用selector对数组进行排序(无返回) 数组 book 中包含 AddressCard对象. 1.对数组调用 sortUsingSelector方法 -(void) sortByName { ...
- java思考题
1.仔细阅读示例: EnumTest.java,运行它,分析运行结果? 你能得到什么结论?你掌握了枚举类型的基本用法了吗? public class EnumTest { public static ...
- 浅谈Struts2(三)
一.Struts2收集client的参数 核心思路: <form method="post" action="XXXX"> <input ty ...
- jQuery selector 选择器
基本选择器 1. id选择器(指定id元素)将id="one"的元素背景色设置为黑色.(id选择器返单个元素) $(document).ready(function () { $( ...
- 获取json格式字符串的简单方法
有的时候需要找一些Json格式的字符串,可以打开任意一个网页进入到调试模式,然后看network相关的访问信息,就可以获取到. 比如: 在记笔记的时候,点击保存后,会发出一些请求,然后有相应的相应,任 ...
- mac上搭建svn服务器
1.terminal 执行svnadmin create 库地址/库名,生成的即为svn库根地址. 2.修改对应目录下conf/svnserve.conf文件: anon-access = read ...
- CSS样式的优先机制
链接:http://www.cnblogs.com/xugang/archive/2010/09/24/1833760.html 又抓到虫子了:IE中奇怪的应用CSS的BUG:http://www.c ...
- mysql数据迁移
使用mysqldump mysqldump -host=host1 -uroot -p123456 -opt sourceDb| mysql -host=host2 -uroot -p123 -C t ...
- JavaScript表单验证年龄
JavaScript表单验证年龄,判断一个输入量是否符合年龄,通过正则表达式实现. //检查年龄 function isAge(str){ var mydate=new Date; var now=m ...