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{ //定义一个多线程共享的票源 ...
随机推荐
- linux下用mail发送邮件
利用外部邮箱发送邮件的方法 bin/mail会默认使用本地sendmail发送邮件,这样要求本地的机器必须安装和启动Sendmail服务,配置很麻烦,并且会带来不必要的 资源占用.而通过改动配置文件能 ...
- [C# 基础知识系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- hibernate通过配置文件生成数据库信息
hibernate可以通过配置文件在数据库生成相应的数据库信息.也可以把数据库的信息生成相应的代码(实体类操作类和映射文件) 下面是通过代码默认对hibernate.cfg.xml信息在数据库生成信息 ...
- Windows系统中使用WMI获取远程服务器的信息
使用WMI获取远程服务器的状态 我做的项目里边主要包含两个内容: (1)对发布在服务器上的服务(IIS服务.WCF服务)是否可以正常访问: (2)获取服务器上的部分指标:如CPU.内存.磁盘空间信息等 ...
- Eclipse怎么全局搜索替换(整个项目)
链接地址:http://jingyan.baidu.com/article/3ea51489c1c0d752e61bba2e.html 我们用Eclipse编程,有时候需要将整个项目的某个字符串替换成 ...
- BZOJ 1221: [HNOI2001] 软件开发(最小费用最大流)
不知道为什么这么慢.... 费用流,拆点.... --------------------------------------------------------------------------- ...
- 简单的mvvm light 应用
public class MainStudentModel:ViewModelBase { //实体 private StudentModel stu = new Stude ...
- sql server 常见问题
自动生成的值 @@identity 存储过程参数应指定参数长度,且不大于数据库长度,自定义方法里如果有参数,也应指定长度,否则会报错,提取数据长度被断 connectionString 可以指定app ...
- 两种解决Qt5显示中文乱码的方法(使用QStringLiteral和#pragma execution_character_set("utf-8")两种方法)
升级到Qt5.X之后,原先解决的Qt显示中文乱码的方法突然不适用了,找了很多方式来解决这个问题第一种:在公司代码里看到的方法,先将对应的cpp文件用windows自带的记事本打开,另存为UTF-8格式 ...
- asp.net个人笔记
1.进程外session一记 配置进程外session, 在webconfig中配置<sessionState timeout="60" mode="StateSe ...