Java多线程(一) 多线程的基本使用
在总结JDBC数据库连接池的时候,发现Java多线程这块掌握得不是很好,因此回头看了下多线程的内容。做一下多线程模块的学习和总结,稳固一下多线程这块的基础。关于多线程的一些理论知识,这里不想啰嗦太多,可以进行下搜索了解。
1. 如何使用Java创建多线程
使用Java多线程,总的来说方法有两种:①继承Thread类,重写run方法 ②把相关的类实现Runnable(可运行)接口,重写run方法。③实现Callable接口(相对用得较少)
package com.scl.thread; public class TestThread
{
public static void main(String[] args) throws Exception
{
String mainName = Thread.currentThread().getName();
System.out.println(mainName + "线程开始运行"); // 方法1 使用继承对线程进行调用
MyThread myThread = new MyThread();
myThread.setName("wft");
myThread.start();
myThread.join(); // 方法2 继承Runnable接口进行调用
Thread thread = new Thread(new MyRunnable());
thread.start(); System.out.println(mainName + "线程结束");
}
} // 使用runnable开启线程
class MyRunnable implements Runnable
{
@Override
public void run()
{
// 获取调用线程的名字
String curName = Thread.currentThread().getName();
System.out.println(curName + "线程启动");
try
{
Thread.sleep(1000);
System.out.println(curName + "正在运行");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(curName + "线程结束");
}
} // 使用Thread进行run方法的编写,开启线程
class MyThread extends Thread
{
// Thread.currentThread()调用这个方法的线程名称。
String s = Thread.currentThread().getName(); // 调用这个类的是main方法调用,run方法交由新线程操作 public MyThread()
{
System.out.println("Thread.currentThread().getname()=" + Thread.currentThread().getName());
// 线程没运行前初始化的名字.因为类的初始化跟线程运行无关,这里返回的是处世话的名字
System.out.println("This.getName=" + this.getName());
} @Override
public void run()
{
// run方法交由新线程操作,所以调用的名称不是main
String strName = Thread.currentThread().getName();
System.out.println("this.getName " + this.getName());
// main
System.out.println("do u no s?" + s); System.out.println(strName + " 开始数数");
for (int i = 0; i < 100; i++)
{
System.out.println(strName + " " + i);
}
System.out.println(strName + " 数数完毕");
} // 返回设置的name
public String bName()
{
return this.getName();
}
}
最应该注意的是给线程标注名称的时候,应该多使用Thread.currentThread().getname() 来获取线程名称。使用this.getName方法很容易出错。
主要该注意的有如下两个:
① 获取名称不在run方法里面,永远返回名称为main。因为在构造线程类的时候,主线程main会进行代码的初始化。run方法由新创建起来的线程去调用,这样run方法里面的名称才能被正确获取到
② 在继承类的构造函数内,如上面MyThread的构造函数内调用getName()方法。该方法是由JDK 源码Thread类继承而来。new一个Thread实例时,系统会调用Thread
下的方法,代码如下
//Thread 类构造函数
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
} // 私有的init方法
private void init(ThreadGroup g, Runnable target, String name,long stackSize) {
init(g, target, name, stackSize, null);
} //init 方法. 更详细内容见JDK源码Thread类363行
private void init(ThreadGroup g, Runnable target, String name,long stackSize, AccessControlContext acc)
所以在构造器内的初始化的时候调用init方法给线程设置name字段。导致参数名称修改且以"Thread-"开头。初始化完毕后,如果用户设置过相关的线程名称,系统会把该字段进行修改,可以运用上述代码中的bName()函数进行验证。
在使用Java多线程的时候,不要直接调用某个实例下的run方法,如果直接使用run方法。则直接调用,不会开辟新的线程进行功能操作。
继承Thread和实现Runnable接口的区别:
① 继承Thread能够简单地实现线程开辟,但由于Java只支持单继承。继承Thread方法实现线程会有比较多的局限性
② 实现Runnable接口能够很好的将线程代码和业务逻辑代码分离,但代码结构相对复杂。一般都会使用实现Runnable方法创建线程。
2. Java多线程下常用方法
① join( ) 多线程是有cpu分配执行时间片段,如果要控制线程操作流程,则需要使用到join方法。join方法会阻塞主线程,主线程会等待join方法的线程执行完毕再继续执行后续的操作。同时join方法可以添加时间,让主线程等待一段时间,如果时间过了。则不再等待继续执行。如:thread.join( ),当主线程编译到该代码时,主线程会停止下来等待thread线程执行完毕后,主线程再继续后续操作
② sleep( ) 不释放锁资源,让调用的线程进行等待。如:thread.sleep( ) ,但代码执行到这一句时,thread会停止下来等待,直到被唤醒或者等到到sleep到的时间点后再进行后续操作。
③ wait( )和notify( )、notifyAll( ) 。这三个方法主要处理线程同步数据时使用。数据同步,也就是几条线程在同时修改一份共享数据。如火车站5名销售员同时在售卖火车票,火车票是固定数量的前提下,如何实现这5名销售员同时知道火车票库存、同一路段火车票售卖、车票信息共享等。
wait方法使当前线程暂停执行并释放对象锁标志。notify和notifyall方法会唤醒几个等待的线程,让线程重新获取锁代码以便后续进行。线程状态图表如下:
关于使用锁以及线程状态内容,将在下一篇博文进行总结,上述内容若有问题,烦请指出纠正。
Java多线程(一) 多线程的基本使用的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- Java线程与多线程教程
本文由 ImportNew - liken 翻译自 Journaldev. Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...
- 黑马程序员——JAVA基础之多线程的线程间通讯等
------- android培训.java培训.期待与您交流! ---------- 线程间通讯: 其实就是多个线程在操作同一个资源,但是动作不同. wait(); 在其他线程调用此对象的notif ...
- Java多线程——<八>多线程其他概念
一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 ...
- Java面试题-多线程
1. java中有几种方法可以实现一个线程? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口. 这两种方法的区别是,如果你的类已经继承了其它的类,那么你只能选择实现Runna ...
- Java面试09|多线程
1.假如有Thread1.Thread2.Thread3.Thread4四条线程分别统计C.D.E.F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现? 把相互独立的计算任 ...
- Java 中传统多线程
目录 Java 中传统多线程 线程初识 线程的概念 实现线程 线程的生命周期 常用API 线程同步 多线程共享数据的问题 线程同步及实现机制 线程间通讯 线程间通讯模型 线程中通讯的实现 @(目录) ...
- 2019/3/7 Java学习之多线程(基础)
Java学习之多线程 讲到线程,就必须要懂得进程,进程是相当于一个程序的开始到结束,而线程是依赖于进程的,没有进程,就没有线程.线程也分主线程和子线程,当在主线程开启子线程时,主线程结束,而子线程还可 ...
- Java编程实现多线程TCP服务器完整实例
Socket ·功能:TCP客户端套接字 ·构造方法: Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号 · ...
随机推荐
- 【v2.x OGE教程 19】 引擎状态控制
1.手机button监听 OGE中提供了在BaseGameLauncher(GameLauncher的父类)和IScene(Scene实现的接口)中定义了onKeyUp和onKeyDown的方法.使得 ...
- as 中的反射 describeType
describeType函数在adobe官方在线文档上的定义如下:生成描述ActionScript对象(命令为方法的参数)的XML对象,此方法实现ActionScript语言的反射编程概念. 这个方法 ...
- px,em,rem的区别
PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. Firefox能够调整px和em,rem,但是96%以上 ...
- Line Search and Quasi-Newton Methods
Gradient Descent 机器学习中很多模型的参数估计都要用到优化算法,梯度下降是其中最简单也用得最多的优化算法之一.梯度下降(Gradient Descent)[3]也被称之为最快梯度(St ...
- 使用Java编写并运行Spark应用程序
我们首先提出这样一个简单的需求: 现在要分析某网站的访问日志信息,统计来自不同IP的用户访问的次数,从而通过Geo信息来获得来访用户所在国家地区分布状况.这里我拿我网站的日志记录行示例,如下所示: 1 ...
- 怎样用VB自动更新应用程序
具体程序实现如下:在应用程序工程MyApp中的部分代码如下:Option Explicit'编译后的应用程序名称,注意没有后缀 .EXE,本例为MYAPPPrivate Const App_Name ...
- 杂乱无章之Oracle(一)
1. 设置共享池大小 SQL>ALTER SYSTEM SET SHARED_POOL_SIZE=32M; 2. 数据库高速缓冲区(database buffer cache):SQL ...
- Android(java)学习笔记96:如何改变spinner系统自带的字体和颜色
1.首先我们要知道spinner系统自带字体和颜色本质: 原生的Spring 控件是无法更改字体和颜色的... 从下面的代码可以看出...红色的标注显示使用的是Android默认的布局.. Spinn ...
- APK文件安装模拟器和ADB命令的使用
1.安装APK文件到模拟器 Android手机使用的执行文件为APK格式,类似于Windows平台的exe文件.在Android模拟器中安装APK文件有多种方法,如果你是开发人员,可以通过Eclips ...
- android scrollview主要的问题
项目做多了之后,会发现其实 ScrollView嵌套ListVew或者GridView等很常用,但是你也会发现各种奇怪问题产生.根据个人经验现在列出常见问题以及代码最少最简单的解决方法. 问题一 : ...