java实现多线程有两种方法:
一种是继承Thread类
如下面例子:
public class TestThread extends Thread {
//实现多线程方法一:继承Thread类,并重载run方法
public void run(){
//要将一段代码在一个新的线程上运行,该代码应写在run函数中
while(true){
System.out.println(Thread.currentThread().getName() + "is running...");
}
}
}
public class ThreadDemo2 {
public static void main(String[] args) {
//启动一个新的线程,不是直接调用Thread类子类对象的run方法,
//而是调用Thread类子类对象的start方法,Thread类对象的start方法
//将产生新的线程,并在该线程上运行该Thread类对象中的run方法,根据
//多态性 实际上运行的是Thread子类的run方法
TestThread testThread = new TestThread();
testThread.start();
while(true){
System.out.println("main thread is running...");
}
}
}
方法二是:实现接口Runnable中的run函数
如下列所示
//实现多线程方法二:实现Runnable接口,重载run函数,
//大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,
//那么应使用 Runnable 接口。这很重要,
//因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。
public class TestThread implements Runnable {
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName() + "is running......");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThread testThread = new TestThread();//创建TestThread类的一个实例
Thread thread = new Thread(testThread);//创建一个Thread类的实例
thread.start();//使线程进入runnable状态
while(true){
System.out.println("main thread is running...");
}
}
2.这两种方法的区别:实现Runnable接口适合多个相同的程序代码访问处理同一资源
如下列所示:
//四个售票窗口售同一中车票,总共有100张,要求这四个售票多线程进行
public class TicketRunnable implements Runnable {
private int tickets = 100;
public void run() {
while(true){
if(tickets > 0){
System.out.println(Thread.currentThread().getName() +
" is saling ticket " + tickets--);
}
}
}
}
public class TicketRunnableDemo {
public static void main(String[] args){
//创建了四个线程,每个线程调用了同一各TicketRunnable对象中run方法,
//访问的是同一个对象中的变量tickets,从而满足了我们的要求。
//实现Runnable接口适合多个相同的程序代码访问处理同一资源
TicketRunnable ticketrunnable = new TicketRunnable();
new Thread(ticketrunnable).start();
new Thread(ticketrunnable).start();
new Thread(ticketrunnable).start();
new Thread(ticketrunnable).start();
}
}
而继承继承Thread类,并重载run方法不能达到此目的
如下所示:
public class TicketThread extends Thread {
private int tickets = 100;
public void run(){
while(true){
if(tickets>0){
System.out.println(Thread.currentThread().getName() +
"is saling ticket " + tickets--);
}
}
}
}
public class TicketThreadDemo {
public static void main(String[] args){
//我们希望的是四个线程共售100,我们创建四个线程
//但结果与我们希望的相反,各个线程各售100张票
new TicketThread().start();
new TicketThread().start();
new TicketThread().start();
new TicketThread().start();
// 如果我们象下面这样写的话,只有一个线程在售票,没有实现四个线程并发售票
// TicketThread ticketThread = new TicketThread();
// ticketThread.start();
// ticketThread.start();
// ticketThread.start();
// ticketThread.start();
}
}
3.后台线程
public class DaemonTest {
public static void main(String[] args){
TicketRunnable ticketRunnable = new TicketRunnable();
Thread thread = new Thread(ticketRunnable);
thread.setDaemon(true);//将此线程设置为后台线程,当进程中只有后台线程时,进程就会结束
thread.start();
}
}
5. 线程同步
在上面的售票程序中,线程可能是不安全的,
比如我们修改一下:
public class ThreadRunnable implements Runnable{
private int tickets = 100;
public void run() {
while(true){
if(tickets > 0){
try{
Thread.sleep(10);//使该线程暂停,
}catch(Exception e){
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName() +
" is saling ticket " + tickets--);
}
}
}
}
再次测试时,发现可能会打印-1 -2 这样的ticket
所以我们要修改一下,使该程序是线程安全的,
public class TicketSynch implements Runnable{
private int tickets = 100;
String str = new String("");//此对象放在run函数之外
public void run(){
while(true){
synchronized(str){//同步代码块
if(tickets > 0){
try{
Thread.sleep(10);
}
catch(Exception e){
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()
+" is saling ticket " + tickets--);
}
}
}
}
}
但是 同步以牺牲程序的性能为代价
5. 同步函数
public class SynchMethod implements Runnable{
private int tickets = 100;
public void run(){
while(true){
sale();
}
}
public synchronized void sale(){
if(tickets > 0){
try{
Thread.sleep(10);
}catch(Exception e){
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()
+ "is saling ticket " + tickets--);
}
}
}
public static void main(String[] args){
//创建了四个线程,每个线程调用了同一各TicketRunnable对象中run方法,
//访问的是同一个对象中的变量tickets,从而满足了我们的要求。
//实现Runnable接口适合多个相同的程序代码访问处理同一资源
SynchMethod synchMethod = new SynchMethod();
new Thread(synchMethod).start();
new Thread(synchMethod).start();
new Thread(synchMethod).start();
new Thread(synchMethod).start();
}
6.代码块和函数间的同步
public class MethodAndBlockSyn implements Runnable{
private int tickets = 100;
String str = new String("");
public void run(){
if(str.equals("method")){
while(true){
sale();
}
}
else{
synchronized(str){//同步代码块
if(tickets > 0){
try{
Thread.sleep(10);
}
catch(Exception e){
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()
+" is saling ticket " + tickets--);
}
}
}
}
public synchronized void sale(){
if(tickets > 0){
try{
Thread.sleep(10);
}catch(Exception e){
System.out.println(e.getMessage());
}
System.out.println(Thread.currentThread().getName()
+ "is saling ticket " + tickets--);
}
}
}
public static void main(String[] args){
MethodAndBlockSyn test = new MethodAndBlockSyn();
new Thread(test).start();// 这个线程调用同步代码块
try{
Thread.sleep(1);//让线程等待100ms 是为了让该线程得到CPU
//避免该线程未得到CPU就将str设置为method,从而使此线程也是调用同步函数
}catch(Exception e)
{
}
test.str = new String("method");
new Thread(test).start();//这个线程调用同步函数
}
分享到:
相关推荐
你可以通过运行这些示例来更好地理解和学习Java多线程的概念。例如,它可能包含一个继承`Thread`的类,一个实现`Runnable`的类,以及演示如何启动和管理这些线程的主程序。 总结,理解并熟练掌握Java中的多线程实现...
在Java中,有两种主要的实现多线程的方式:通过`Thread`类和通过实现`Runnable`接口。 1. **通过`Thread`类实现多线程** 当我们创建一个`Thread`类的子类时,可以重写`run()`方法来定义线程执行的任务。例如: ``...
Java提供了两种主要的方法来创建线程,分别是直接继承自`Thread`类和实现`Runnable`接口。这两种方法各有其特点和适用场景。 1. **继承Thread类**: 当你选择继承`Thread`类时,你需要创建一个新的类,该类直接...
### Java中的两种多线程实现方式 在Java中,实现多线程的两种主要方式分别是:**通过继承`Thread`类** 和 **实现`Runnable`接口**。下面将详细介绍这两种方式,并提供相应的示例程序。 #### 一、通过继承`Thread`...
Java中有两种实现多线程的方式。一是直接继承Thread类,二是实现Runnable接口。那么这两种实现多线程的方式在应用上有什么区别呢? 为了回答这个问题,我们可以通过编写一段代码来进行分析。我们用代码来模拟铁路...
创建一个新线程通常有两种方式:继承Thread类并重写run()方法,或者实现Runnable接口并提供run()方法。在run()方法中编写线程执行的代码。 进度条通常由主线程负责显示,而耗时任务则在一个或多个工作线程中执行。...
总的来说,通过Java多线程和队列数据结构,我们可以有效地模拟排队叫号系统。这种模拟有助于理解和实践并发编程,同时也为我们解决实际问题提供了思路。在这个过程中,我们学习了线程同步、队列操作以及如何在Java中...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
通过对这个项目的学习,开发者不仅可以掌握Java多线程编程的基本原理,还能了解到如何将多线程技术应用于实际的图形用户界面开发,从而提升自己的编程能力。记得在实践中不断调试和优化,才能真正掌握这些技能。
在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致...
Java 提供了两种方法来解决线程同步问题: 1. synchronized 关键字:synchronized 关键字可以用来声明 synchronized 方法或块,以控制对共享资源的访问。 2. synchronized 块:synchronized 块可以用来控制对共享...
在Java中,创建线程主要有两种方式:继承Thread类和实现Runnable接口。在提供的实例中,我们可能会看到这两种方式的运用。 1. 继承Thread类:通过创建新的Thread子类并重写其run()方法,然后创建该子类的实例并调用...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
Java提供了两种创建线程的方式:继承Thread类和实现Runnable接口。在这个实例中,我们可能会选择实现Runnable接口,因为这样可以避免单继承的限制,更易于代码复用。 创建进度条的关键在于同步机制。Java提供了多种...
总的来说,这个项目是一个很好的实践示例,它不仅展示了Java多线程编程的基本概念,还结合了图形用户界面的设计,帮助初学者理解和掌握这两个重要的编程技能。通过分析和运行这个源代码,开发者不仅可以学习到多线程...
总结,这个"java多线程应用实现示例"通过小球运动的模拟,深入浅出地展示了Java多线程的运用,包括线程创建、同步、通信和线程池管理等关键概念。学习这个示例有助于理解和掌握Java多线程编程,为实际项目开发中的...
在 Java 中实现多线程主要有两种方法:继承 `Thread` 类和实现 `Runnable` 接口。这两种方法都可以帮助我们创建和管理线程,但它们各自有不同的适用场景和优缺点。 ### 1. 继承 `Thread` 类 当你创建一个新的类去...
Java多线程编程是Java编程中的一种重要技术,用于实现多任务并发执行,提高程序的执行效率和响应速度。在本文中,我们将介绍如何使用Java实现两个线程同时运行的案例,涉及Java多线程相关操作与使用技巧。 Java多...
综上所述,这个“java实现的多线程服务器”项目涵盖了Java多线程编程、网络编程、并发控制、异常处理和性能优化等多个重要知识点,对于学习和实践Java服务器开发具有很高的价值。通过深入研究和理解这个项目,开发者...