java多线程编程技术详解和实例代码

1. Java和他的API都可以使用并发。
可以指定程序包含不同的执行线程,每个线程都具有自己的方法调用堆栈和程序计数器,使得线程在与其他线程并发地执行能够共享程序范围内的资源,比如共享内存,这种能力被称为多线程编程(multithreading),在核心的C和C++语言中并不具备这种能力,尽管他们影响了JAVA的设计。
2. 线程的生命周期
新线程的生命周期从“新生”状态开始。程序启动线程前,线程一直是“新生”状态;程序启动线程后,线程进入“可运行”状态。“可运行”状态的线程,被认为是正在执行他的任务。
在程序启动线程之前,线程一直处于“等待”状态,只有当另一个线程通知正在等待的线程继续执行时,这个线程才会从“等待”状态恢复到“可运行”状态。
“可运行”状态的线程可以进入“定时等待”状态,等待一个指定的时间段。当时间到达或线程正在等待的某个事件发生时,该线程就会返回“可运行”状态。即使处理器可以使用,处于“定时等待”状态和“等待”状态的线程也不能用它。当处于“可运行”状态的线程正在等待另一个线程执行任务时,如果它提供了可选的等待时间段,则这个线程会进入“定时等待”状态。当另一个线程通知了这个线程,或者当定时的时间段到达时(以先满足的为准),这个线程就会返回到“可运行”状态.。使线程进入“定时等待”状态的另一方法是是处于“可运行”状态的线程睡眠。睡眠线程会在“定时等待”状态维持一个指定的时间段(称为睡眠时间段),过了这段时间,它会返回到“可运行”状态。当线程没有工作要执行时,它会立即睡眠。;例
当线程试图执行某个任务,而任务又不能立即完成,线程就从“可运行”状态转到“阻塞”状态。;例。即使有处理器可供使用,“阻塞”状态的线程也不能使用它。
线程成功完成任务,或者(由于出错)终止了时,“可运行”线程就会进入“终止”状态(有时称“停滞”状态)。
在操作系统级别,JAVA的“可运行”状态通常包含两个独立的状态。当线程首先从“新生”状态转到“可运行”状态,线程处于“就绪”状态。当操作系统将线程给处理器时,线程就从“就绪”状态进入“运行”状态(即开始执行),这也被称为“调度线程”。大多数操作系统中,每个线程被赋予一小段处理器时间(时间片)来执行任务。当时间片到达时,线程就会返回到“就绪”状态,而操作系统将另一个线程给予处理器。
3. 线程优先级与线程调度
JAVA的线程优先级范围为MIN_PRIORITY(常量1)到MAX_PRIORITY(常量10),默认是NORM_PRIORITY(常量5)
4. 创建并执行线程
创建线程推介实现Runnable接口
(1)Runnable与Thread类
// Fig. 4.1: PrintTask.java
// PrintTask class sleeps for a random time from 0 to 5 seconds
import java.util.Random;
public class PrintTask implements Runnable
{
private final int sleepTime; // random sleep time for thread
private final String taskName; // name of task
private final static Random generator = new Random();
public PrintTask( String name )
{
taskName = name; // set task name
// pick random sleep time between 0 and 5 seconds
sleepTime = generator.nextInt( 5000 ); // milliseconds
} // end PrintTask constructor
// method run contains the code that a thread will execute
public void run()
{
try // put thread to sleep for sleepTime amount of time
{
System.out.printf( "%s going to sleep for %d milliseconds.\n",
taskName, sleepTime );
Thread.sleep( sleepTime ); // put thread to sleep
} // end try
catch ( InterruptedException exception )
{
System.out.printf( "%s %s\n", taskName,
"terminated prematurely due to interruption" );
} // end catch
// print task name
System.out.printf( "%s done sleeping\n", taskName );
} // end method run
} // end class PrintTask
// Fig. 4.2 ThreadCreator.java
// Creating and starting three threads to execute Runnables.
import java.lang.Thread;
public class ThreadCreator
{
public static void main( String[] args )
{
System.out.println( "Creating threads" );
// create each thread with a new targeted runnable
Thread thread1 = new Thread( new PrintTask( "task1" ) );
Thread thread2 = new Thread( new PrintTask( "task2" ) );
Thread thread3 = new Thread( new PrintTask( "task3" ) );
System.out.println( "Threads created, starting tasks." );
// start threads and place in runnable state
thread1.start(); // invokes task1抯 run method
thread2.start(); // invokes task2抯 run method
thread3.start(); // invokes task3抯 run method
System.out.println( "Tasks started, main ends.\n" );
} // end main
} // end class RunnableTester
(2)线程管理与Executor框架
5为显示的创建线程,但推介使用Executor接口,用来管理Runnable对象的执行。Executor对象创建并管理一组Runnable对象的线程,这组线程就做线程池(thread pool).优点是Executor对象能复用了已经有的线程,减少为每个任务创建新线程的开销,提高性能。
Executor接口只声明了一个名称为execute的方法,接收一个Runnable实参。Executor会将传递给他的execute方法的每个Runnable对象赋予线程池中可以用的线程。如果没有可以用的线程,则Executor会创建一个新线程,或等待某个线程会成为可用的,并会将这个线程赋予传递给execute方法的Runnable对象。
ExecutorService接口扩展了Executor接口。
// Fig. 4.3: TaskExecutor.java
// Using an ExecutorService to execute Runnables.
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class TaskExecutor
{
public static void main( String[] args )
{
// create and name each runnable
PrintTask task1 = new PrintTask( "task1" );
PrintTask task2 = new PrintTask( "task2" );
PrintTask task3 = new PrintTask( "task3" );
System.out.println( "Starting Executor" );
// create ExecutorService to manage threads
ExecutorService threadExecutor = Executors.newCachedThreadPool();
// start threads and place in runnable state
threadExecutor.execute( task1 ); // start task1
threadExecutor.execute( task2 ); // start task2
threadExecutor.execute( task3 ); // start task3
// shut down worker threads when their tasks complete
threadExecutor.shutdown();
System.out.println( "Tasks started, main ends.\n" );
} // end main
} // end class TaskExecutor
5. 线程同步
(1)线程同步(thread synchronization),协调多个并发线程对共享数据的访问。这种方式同步多个线程,就可以保证访问共享对象的每个线程都能同步地将其他所有线程排除在外,这被称为“互斥”。
另一个方法,使用JAVA内置的监控器(monitor)。每个对象都有一个监控器和监控锁(或内置锁)。监控器保证任何时候监控锁由具有最大可能的唯一一个线程持有。
(2)同步的数据共享:执行原子操作。
// Adds integers to an array shared with other Runnables
import java.lang.Runnable;
public class ArrayWriter implements Runnable
{
private final SimpleArray sharedSimpleArray;
private final int startValue;
public ArrayWriter( int value, SimpleArray array )
{
startValue = value;
sharedSimpleArray= array;
} // end constructor
public void run()
{
for ( int i = startValue; i < startValue + 3; i++ )
{
sharedSimpleArray.add( i ); // add an element to the shared array
} // end for
} // end method run
} // end class ArrayWrite
// Fig 5.2: SharedArrayTest.java
// Executes two Runnables to add elements to a shared SimpleArray.
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
public class SharedArrayTest
{
public static void main( String[] arg )
{
// construct the shared object
SimpleArray sharedSimpleArray = new SimpleArray( 6 );
// create two tasks to write to the shared SimpleArray
ArrayWriter writer1 = new ArrayWriter( 1, sharedSimpleArray );
ArrayWriter writer2 = new ArrayWriter( 11, sharedSimpleArray );
// execute the tasks with an ExecutorService
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute( writer1 );
executor.execute( writer2 );
executor.shutdown();
try
{
// wait 1 minute for both writers to finish executing
boolean tasksEnded = executor.awaitTermination(
1, TimeUnit.MINUTES );
if ( tasksEnded )
System.out.println( sharedSimpleArray ); // print contents
else
System.out.println(
"Timed out while waiting for tasks to finish." );
} // end try
catch ( InterruptedException ex )
{
System.out.println(
"Interrupted while wait for tasks to finish." );
} // end catch
} // end main
} // end class SharedArrayTest
// Fig.5.3 : SimpleArray.java
// Class that manages an integer array to be shared by multiple
// threads with synchronization.
import java.util.Random;
public class SimpleArray
{
private final int array[]; // the shared integer array
private int writeIndex = 0; // index of next element to be written
private final static Random generator = new Random();
// construct a SimpleArray of a given size
public SimpleArray( int size )
{
array = new int[ size ];
} // end constructor
// add a value to the shared array
public synchronized void add( int value )
{
int position = writeIndex; // store the write index
try
{
// put thread to sleep for 0-499 milliseconds
Thread.sleep( generator.nextInt( 500 ) );
} // end try
catch ( InterruptedException ex )
{
ex.printStackTrace();
} // end catch
// put value in the appropriate element
array[ position ] = value;
System.out.printf( "%s wrote %2d to element %d.\n",
Thread.currentThread().getName(), value, position );
++writeIndex; // increment index of element to be written next
System.out.printf( "Next write index: %d\n", writeIndex );
} // end method add
// used for outputting the contents of the shared integer array
public String toString()
{
String arrayString = "\nContents of SimpleArray:\n";
for ( int i = 0; i < array.length; i++ )
arrayString += array[ i ] + " ";
return arrayString;
} // end method toString
} // end class SimpleArray
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# java多线程编程技术
# java
# 多线程
# 多线程详解
# java多线程编程实例
# java多线程学习之死锁的模拟和避免(实例讲解)
# java多线程之火车售票系统模拟实例
# JAVA多线程实现生产者消费者的实例详解
# JAVA 多线程爬虫实例详解
# Java多线程下载文件实例详解
# java 基础教程之多线程详解及简单实例
# Java多线程窗口售票问题实例
# 就会
# 被称为
# 操作系统
# 多个
# 可以用
# 转到
# 可以使用
# 它会
# 会将
# 用它
# 正在等待
# 自己的
# 也不
# 都有
# 过了
# 都能
# 才会
# 会在
# 这段
相关文章:
怀化网站制作公司,怀化新生儿上户网上办理流程?
网站微信制作软件,如何制作微信链接?
广平建站公司哪家专业可靠?如何选择?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
网站制作壁纸教程视频,电脑壁纸网站?
南平网站制作公司,2025年南平市事业单位报名时间?
PHP正则匹配日期和时间(时间戳转换)的实例代码
建站之星如何快速更换网站模板?
创业网站制作流程,创业网站可靠吗?
北京网站制作的公司有哪些,北京白云观官方网站?
个人网站制作流程图片大全,个人网站如何注销?
如何在建站宝盒中设置产品搜索功能?
官网网站制作腾讯审核要多久,联想路由器newifi官网
如何快速登录WAP自助建站平台?
深圳网站制作的公司有哪些,dido官方网站?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何快速完成中国万网建站详细流程?
宝塔面板如何快速创建新站点?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
如何通过西部建站助手安装IIS服务器?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
高防服务器租用首荐平台,企业级优惠套餐快速部署
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
定制建站哪家更专业可靠?推荐榜单揭晓
重庆市网站制作公司,重庆招聘网站哪个好?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
香港服务器租用费用高吗?如何避免常见误区?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站之星如何一键生成手机站?
建站之星如何助力网站排名飙升?揭秘高效技巧
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
如何快速搭建高效WAP手机网站吸引移动用户?
在线制作视频网站免费,都有哪些好的动漫网站?
宝塔新建站点报错如何解决?
网站设计制作企业有哪些,抖音官网主页怎么设置?
如何登录建站主机?访问步骤全解析
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何在阿里云香港服务器快速搭建网站?
建站VPS推荐:2025年高性能服务器配置指南
建站之星安装模板失败:服务器环境不兼容?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何在Windows服务器上快速搭建网站?
深圳网站制作平台,深圳市做网站好的公司有哪些?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
*请认真填写需求信息,我们会在24小时内与您取得联系。