java多线程理解及实现
其实多线程也很好理解,就好比我们坐高铁、飞机过安检一样,过安检的时候一个入口只有一个安检口,而多线程就是为安检开启了多个安检口,话不多说贴代码
线程实现的三种方式:
一、继承Thread类创建线程类
1、定义Thread子类,重写run()方法,把需要做线程操作的类容放入该方法体中。
2、创建Thread子类的实例,在实例中调用线程对象的start()启动线程方法,此方法也是代表线程数量的方法,需要启动多个线程时,只需要调用多次则以。
package com.thread;
public class FirstThreadTest extends Thread{
int i = 0;
//重写run方法,run方法的方法体就是现场执行体
public void run(){
for(;i<100;i++){
System.out.println(getName()+" "+i);
}
}
public static void main(String[] args){
for(int i = 0;i< 100;i++){
System.out.println(Thread.currentThread().getName()+" :"+i);
if(i==20){
new FirstThreadTest().start();
new FirstThreadTest().start();
}
}
}
}
上述代码中Thread.currentThread()方法返回当前正在执行的线程对象,getName()方法返回线程名称。
二、通过Runnable接口创建线程类,这也是常用的一种
1、定义runnable接口实现类,并重写run()方法,此方法跟继承Thread类中的run是一样的
2、创建实现类的实例,并在实例中创建Thread对象,该对象也是代表线程数量的对象,启动多个线程只需要多次调用对象的start()方法则以。
package com.thread;
public class RunnableThreadTest implements Runnable
{
private int i;
public void run()
{
for(i = 0;i <100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
public static void main(String[] args){
for(int i = 0;i < 100;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
if(i==20){
RunnableThreadTest rtt = new RunnableThreadTest();
new Thread(rtt,"新线程1").start();
new Thread(rtt,"新线程2").start();
}
}
}
}
三、通过线程池实现多线程,这个是做常用的也是最实用的
1、通过ExecutorService来管理线程池,并且初始化线程数量
2、定义队列来存放线程池
3、循环判断线程是否执行还是睡眠
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class TestThread { // 首先初始化ExecutorService线程池,用来管理多线程,设置线程数量
private static ExecutorService pool = Executors.newFixedThreadPool(50); // 定义Queue队列,用来存放线程池,Runnable就是线程对象
private static Queue<Runnable> queue = new ConcurrentLinkedDeque<>(); // 类加载执行多线程
static {
(new TestThread()).new ThreadPoolInvoke().start();
} private class ThreadPoolInvoke extends Thread{
@Override
public void run() {
// 死循环一直判断队列
while (true) {
try {
// 如果为空,线程睡眠3秒
if (queue.isEmpty()) {
Thread.sleep(1000 * 3);
}
// 如果不为空则执行任务,定义excute方法
excute();
} catch (Exception e) {
// TODO: handle exception
} }
} }
/**
* 设置线程到队列方法
* @param runnable
*/
public static void setTask(Runnable runnable) {
queue.add(runnable);
} /**
* 执行线程任务
*/
private void excute() {
//为了确保线程安全,这里可以设置同步锁,this表示当前进入者
//synchronized (this) {
// 获取queue队列size
int curLen = queue.size();
for (int i = 0; i < curLen; i++) {
// poll 方法表示从队列中删除第一个元素
Runnable item = queue.poll();
// 然后把对象交给多线程处理
pool.execute(item);
}
//}
}
}
好了,今天的多线程分享就到这,是否学会了呢?
java多线程理解及实现的更多相关文章
- 从JAVA多线程理解到集群分布式和网络设计的浅析
对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些 ...
- 关于java多线程理解到集群分布式和网络设计的浅析
对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题, 另外关于java多线程的知识也是非常的多,本文中先介绍和说明一 ...
- java多线程理解2
1. 什么时候必须同步?什么叫同步?如何同步? 要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(或 volatile)以确保一个线程可以看见 ...
- Java多线程理解
首先说一下进程和线程的区别 进程:是计算机运用程序实例,拥有独立的内存空间和数据(猜测内存堆应该是作用的进程上),一个进程包含多个子线程,不同进程相互独立: 线程:cpu执行的基本单位,拥有独立的寄存 ...
- Java多线程-----理解CountDownLatch
CountDownLatch简介 CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHa ...
- Java多线程理解:线程安全的集合对象
1.概念介绍 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就 ...
- (转载)Java多线程入门理解
转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...
- java多线程的理解
java多线程的理解 线程的5种状态:新建,就绪,运行,阻塞,死亡. Thread.sleep:线程 运行状态 转为 阻塞状态,(其它线程启动运行) Thread.yield: 线程 运行 ...
- 关于java多线程中异常捕获的理解
在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...
随机推荐
- TensorFlow笔记-变量,图,会话
变量 存储一些临时值的作用或者长久存储.在Tensorflow中当训练模型时,用变量来存储和更新参数.变量包含张量(Tensor)存放于内存的缓存区.建模时它们需要被明确地初始化,模型训练后它们必须被 ...
- [leetcode] 67. Add Binary (easy)
原题链接 思路: 用一个数保存进制,从后往前不断pop出两个数字和进制数相加,放入返回值中. var addBinary = function(a, b) { var arrA = a.split(' ...
- 2017day2
系统模块: # Author: sonny# -*- coding:utf-8 -*-import sys; #print(sys.path);print(sys.argv);print(sys.ar ...
- 学习16内容# 1.自定义模块 # 2.time # 3.datetime # 4.random
模块的定义与分类 模块是什么? 这几天,我们进入模块的学习.在学习模块之前,我们首先要知道,什么是模块? 一个函数封装一个功能,你使用的软件可能就是由n多个函数组成的(先不考虑面向对象).比如 ...
- sqlserver 2008 无法使用特殊主体‘sa’,错误15405
今天莫名其妙的遇到一个问题,还原了几个数据库到新的服务器上,突然发现sa用户对某几个数据库没有权限(用户映射): 我手工勾选相应数据库的db_owner权限之后,报错:无法使用特殊主体'sa',错误1 ...
- shiro-helloworld
1.目录结构 2.log4j.properties # # Licensed to the Apache Software Foundation (ASF) under one # or more c ...
- cookbook_数据结构和算法
1.1将数据分解为单独的变量 list_a = [1,2,3,4,5,6,7,8,9] a,b,c,d,e,f,g,h,i = list_a print(a,b,c,d,e,f,g,h,i) #使用相 ...
- JQuery制作简易的考试答题管理系统
网页效果: 代码部分: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- Python版:Selenium2.0之WebDriver学习总结_实例1
Python版:Selenium2.0之WebDriver学习总结_实例1 快来加入群[python爬虫交流群](群号570070796),发现精彩内容. 实属转载:本人看的原文地址 :http:/ ...
- 检测人脸及眼睛【OpenCV-Python实现 源码+打包.exe文件】
之前用opencv做的一个人脸及双眼检测,在此分享给大家 链接:https://pan.baidu.com/s/1BsKBH3wOF9TmdbRlPagEVQ 提取码:cqkv 效果如下: