Java学习笔记-多线程-创建线程的方式
创建线程
- 创建线程的方式:
- 继承java.lang.Thread
- 实现java.lang.Runnable接口
- 所有的线程对象都是Thead及其子类的实例
- 每个线程完成一定的任务,其实就是一段顺序执行的代码
继承java.lang.Thread创建线程
public class Test1 {
public static void main(String[] args){
System.out.println("现在是主线程: "+Thread.currentThread());
//用静态方法获取当前正在执行的线程
System.out.println("下面新建两个线程");
new Test(100).start();
new Test(100).start();
//这里开启两个线程,但不是完成同一件任务
}
}
class Test extends Thread{
//继承Thread类
private int tickets;
Test (int tick){
tickets=tick;
}
public void run(){
for (;tickets>0;tickets--) {
System.out.println("当前线程:"+getName()+" 卖出第 "+tickets+" 张票。");
//用this获得当前线程
if (tickets==1){
System.out.println("票已卖完,当前线程是: "+getName());
}
}
}
}
0036 Java学习笔记-多线程-创建线程的三种方式
创建线程
- 创建线程的三种方式:
- 继承java.lang.Thread
- 实现java.lang.Runnable接口
- 实现java.util.concurrent.Callable接口
- 所有的线程对象都是Thead及其子类的实例
- 每个线程完成一定的任务,其实就是一段顺序执行的代码
继承java.lang.Thread创建线程
package testpack;
public class Test1 {
public static void main(String[] args){
System.out.println("现在是主线程: "+Thread.currentThread()); //用静态方法获取当前正在执行的线程
System.out.println("下面新建两个线程");
new A(100).start();
new A(100).start(); //这里开启两个线程,但不是完成同一件任务
}
}
class A extends Thread{ //继承Thread类
private int tickets;
A (int tick){
tickets=tick;
}
public void run(){
for (;tickets>0;tickets--) {
System.out.println("当前线程:"+getName()+" 卖出第 "+tickets+" 张票。"); //用this获得当前线程
if (tickets==1){
System.out.println("票已卖完,当前线程是: "+getName());
}
}
}
}
- 继承Thread类,开启线程的步骤:
- 定义一个类,继承Thread,重写run()方法,run()方法就是线程要完成的任务
- 创建该类的实例,并调用start()方法启动线程
- 继承Thread类开启的线程,各自完成各自的任务
实现java.lang.Runnable接口创建线程
public class Test1 {
public static void main(String[] args){
System.out.println("现在是主线程: "+Thread.currentThread());
System.out.println("下面新建两个线程");
Test test=new Test(100);
//创建一个任务的对象
new Thread(test,"线程A").start();
//以同一个任务对象为target,开启两个线程
new Thread(test,"线程B").start();
//两个线程完成同一项任务,但是二者协作沟通不好
}
}
class Test implements Runnable{
//实现Runnable接口
private int tickets;
Test (int tick){
tickets=tick;
}
public void run(){
//同样重写run()方法,就是线程要完成的任务
for (;tickets>0;tickets--) {
System.out.println("当前线程:"+Thread.currentThread()+" 卖出第 "+tickets+" 张票。");
if (tickets==1){
System.out.println("票已卖完,当前线程是: "+Thread.currentThread());
}
}
}
}
Thread、Runnable的比较
线程的生命周期
start()与run()方法
|
Java学习笔记-多线程-创建线程的方式的更多相关文章
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- java学习笔记 --- 多线程(线程安全问题——同步代码块)
1.导致出现安全问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 2.解决线程安全问题方法: 同步代码块: synchronized(对象){ 需要同步的代码; ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- java学习笔记 --- 多线程(多线程的创建方式)
1.创建多线程方式1——继承Thread类. 步骤: A:自定义类MyThread继承Thread类. B:MyThread类里面重写run()? 为什么是run()方法呢? C:创建对象 D:启 ...
- 0041 Java学习笔记-多线程-线程池、ForkJoinPool、ThreadLocal
什么是线程池 创建线程,因为涉及到跟操作系统交互,比较耗费资源.如果要创建大量的线程,而每个线程的生存期又很短,这时候就应该使用线程池了,就像数据库的连接池一样,预先开启一定数量的线程,有任务了就将任 ...
- JAVA学习笔记16——控制线程
Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程执行. join线程 Thread提供了让一个线程等待另一个线程完成的方法——join().当在某个线程执行流中 ...
- 0039 Java学习笔记-多线程-线程控制、线程组
join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long ...
- 0040 Java学习笔记-多线程-线程run()方法中的异常
run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...
随机推荐
- 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况
自从人类学会了使用火,烤制的方式替代了人类的消化系统部分功能,从此人类的消化系统更加简单,加速了人脑的进化:自从SharePoint 2010开始有了Client Side Object Model ...
- 解决:eclipse删除工程会弹出一个对话框提示“[project_name]”contains resources that are not in sync with"[workspace_name...\xx\..xx\..\xx]"
提示“[project_name]”contains resources that are not in sync with"[workspace_name...\xx\..xx\..\xx ...
- Ajax中Get请求与Post请求的区别
Get请求和Post请求的区别 1.使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来 2.使用Get请求发送数据量小,Post请求发送数据量大 例子 页面的HTML代码: &l ...
- IIS7如何部署asp.net网站
第一步:发布网站 右键asp.net web项目,选择发布, 然后新建配置文件名称并选择 "文件系统" 发布方法. 目标位置选择本地新建的文件夹如: IISWebSite 第二 ...
- javascript-装饰者模式
装饰者模式笔记 在不改变原对象的基础上, 通过对其进行包装拓展(添加属性或方法)使原有对象可以满足用户的更复杂要求. 需求不是一成不变的,需求会不断改进,以增强用户体验 demo实例:对输入框添加fo ...
- 2-3 Linux文件管理命令详解
1. 复制文件 cp: copy 格式 SRCFILE DEST 一个文件到一个文件 多个文件到一个目录 注,cd 后面什么都不加,是进入用户的家目录 如果目标文件不存在,则先创建文 ...
- appdata
C:/Users/用户名/AppData里面默认有三个文件夹,分别是Local.LocalLow.Roaming,简单地来说,都是用来存放软件的配置文件和临时文件的,里面有很多以软件公司或者软件名称命 ...
- linux小技巧
主机禁止ping: 修改/proc/sys/net/ipv4/icmp_echo_ignore_all 值为1 默认是0 echo '1' > /proc/sys/net/ipv4/icmp_e ...
- 从微软下载安装Windows10
如果你需要安装或重新安装 Windows 10,可以通过此页面上的工具,使用 U 盘或 DVD 创建你自己的安装介质. 开始之前 确保你具有以下内容: Internet 连接(可能产生 Interne ...
- EF级联删除
引言 在主表中指定Key,子表中指定Required后,并不会在数据库中生成级联删除的外键.那怎么才能使EF在数据中生成级联删除的外键? SQLServer数据库中级联删除功能配置界面: 上图 ...