`
jiaguwen123
  • 浏览: 415218 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

多线程+socket+文件读写<一>

    博客分类:
  • view
阅读更多

 ------------------------------------多线程----------------------------------
多线程:
0.
多线程的概念:
多线程是这样一种机制,它允许在程序中并发执行多个线程,且每个线程彼此间互相独立。
并发的理解:
多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。
1.
实现线程的方式有两种:
1、继承java.lang.Thread,并重写它的run()方法,将线程的执行主体放入其中。
2、实现java.lang.Runnable接口,实现它的run()方法,并将线程的执行主体放入其中。
==>多线程的执行逻辑:
当主线程被挂起时, 其它就绪的线程会根据选择最高优先级的来执行;
当主线程的挂起时间 > 子线程的执行时间时,子线程执行完后回到主线程,等待主线程醒来.
当主线程的挂起时间 < 子线程的执行时间时,主线程挂起时间到的,自动醒来,回到主线程,此时可以判断子线程是否存在,若有,可stop之.
上面两种实现线程的方式在启动时会有所不同。
#         ThreadTest tt = new ThreadTest();  
#         // 启动线程  
#         tt.start(); 
#         // 创建一个线程实例  
#         Thread t = new Thread(new RunnableTest());  
#         // 启动线程  
#         t.start();  
2.
线程状态的具体信息如下:
   1. NEW(新建状态、初始化状态):线程对象已经被创建,但是还没有被启动时的状态。这段时间就是在我们调用new命令之后,调用start()方法之前。
   2. RUNNABLE(可运行状态、就绪状态):在我们调用了线程的start()方法之后线程所处的状态。
   3. BLOCKED(阻塞状态、被中断运行):
   4.TERMINATED(死亡状态、终止状态):线程完成执行后的状态。或run()在运行过程中抛出了一个异常,而这个异常没有被程序捕获,导致这个线程异常终止进入TERMINATED状态。
3.
你可以调用 Thread 类的方法 getPriority() 和 setPriority()来存取线程的优先级,线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间,缺省是5(NORM_PRIORITY)。
4.
同步synchronized
重点理解:
synchronized 方法,用来控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞;方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放;此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态.
也就是说:
线程在执行同步方法时是具有排它性的。当任意一个线程进入到一个对象的任意一个同步方法时,这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导致它释放了该对象的同步锁之后。在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。
在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。

同步块也一样:
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
基本格式:
同步方法:

Java代码
public void methodAAA()
  {
  synchronized (this) // (1)
  {
  //…..
  }
  }

同步块:

Java代码
public void methodAAA()
  {
  synchronized (this) // (1)
  {
  //…..
  }
  }

实例如下:
同步方法:

Java代码
public class Thread1 implements Runnable {
    int num=100;
    
    public synchronized void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName()+ " 's num is " + num--);
            }
    }
    public static void main(String[] args) {
        Thread1 t1 = new Thread1();
        Thread ta = new Thread(t1, "A");
        Thread tb = new Thread(t1, "B");
        ta.start();
        tb.start();
    }
}

同步块:

Java代码
public class Thread1 implements Runnable {
    int num = 100;
    public void run() {
        synchronized (this) {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName()
                        + " 's num is " + num--);
            }
        }
    }
    public static void main(String[] args) {
        Thread1 t1 = new Thread1();
        Thread ta = new Thread(t1, "A");
        Thread tb = new Thread(t1, "B");
        ta.start();
        tb.start();
    }
}


添加了同步后,结果:
A 's num is 100
A 's num is 99
A 's num is 98
A 's num is 97
A 's num is 96
B 's num is 95
B 's num is 94
B 's num is 93
B 's num is 92
B 's num is 91
若不添加同步:
A 's num is 100
A 's num is 98
A 's num is 97
A 's num is 96
A 's num is 95
B 's num is 99 --此处
B 's num is 94
B 's num is 93
B 's num is 92
B 's num is 91
说明:
则线程A正在处理的中间数据若结果数据(99),将线程B中调用了;A又调用了线程B的中间数据,继续计算.
注意:
在定义接口方法时不能使用synchronized关键字。
构造方法不能使用synchronized关键字,但可以使用下节要讨论的synchronized块来进行同步。
3.
Lock是一个接口,它位于Java 5.0新增的java.utils.concurrent包的子包locks中。实现Lock接口的类具有与synchronized关键字同样的功能,但是它更加强大一些。java.utils.concurrent.locks.ReentrantLock是较常用的实现了Lock接口的类。上面的实例可以变为:

Java代码
public class Thread1 implements Runnable {
    int num = 100;
    private Lock lock = new ReentrantLock();   
    public void run() {
            try {
                lock.lock();
                for (int i = 0; i < 5; i++) {
                    System.out.println(Thread.currentThread().getName()
                            + " 's num is " + num--);
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            finally
            {
                lock.unlock();
            }
    }
    public static void main(String[] args) {
        Thread1 t1 = new Thread1();
        Thread ta = new Thread(t1, "A");
        Thread tb = new Thread(t1, "B");
        ta.start();
        tb.start();
    }
}

lock ()方法用于锁定对象,unlock()方法用于释放对对象的锁定,他们都是在Lock接口中定义的方法。位于这两个方法之间的代码在被执行时,效果等同于被放在synchronized同步块中。一般用法是将需要在lock()和unlock()方法之间执行的代码放在try{}块中,并且在 finally{}块中调用unlock()方法,这样就可以保证即使在执行代码抛出异常的情况下,对象的锁也总是会被释放,否则的话就会为死锁的产生增加可能。
注意:
引入了锁,但是锁的引入常常会造成一个很大的问题——死锁 。
死锁就是一个进程中的每个线程都在等待这个进程中的其他线程释放所占用的资源,从而导致所有线程都无法继续执行的情况。

分享到:
评论

相关推荐

    java多线程+Socket实现的漂亮QQ

    该项目是一个基于 Java 的即时通讯软件,集成了 Java Swing、Spring、Hibernate、MySQL5、Socket、多线程和 IO 流等多种技术。通过这些技术的综合运用,实现了用户注册登录、聊天记录保存、文件传输等多种功能,并且...

    tkinter+多线程+socket网络登录,群聊聊天室

    在Python编程领域,构建一个基于`tkinter`的图形用户界面(GUI)应用程序,并结合多线程和`socket`网络编程技术,可以实现一个功能完善的网络登录和群聊聊天室。下面将详细介绍这些知识点。 首先,`tkinter`是...

    linux下多线程读写socket的简单例子

    在Linux操作系统中,多线程编程与网络通信的结合是一个重要的技术领域,特别是在服务器开发中。...对于初学者来说,这是一个很好的起点,通过动手实践,逐步掌握Linux多线程Socket编程的核心技巧。

    java socket通讯例程 多线程读写 可以同时收发不同终端的消息

    在主线程中通过控制台读取键盘...服务器在收到一个socket连接之后,把该socket保存到队列中,并对队列中的每个socket开启各自的读写线程。测试可以在不同控制台运行server和client,服务器接收消息时,会显示消息来源

    多线程socket文件传输

    "多线程socket文件传输"是一个常见的应用场景,特别是在大数据交换、文件共享等需求中。本项目使用C语言实现了一个非阻塞的多线程socket文件传输程序,尽管可能存在一些问题,但对初学者来说,它能提供宝贵的实践...

    基于WCF多线程的SOCKET文件传输服务

    总之,基于WCF的多线程SOCKET文件传输服务是一个复杂而实用的系统,它结合了WCF的易用性和SOCKET的灵活性,通过多线程实现了高效的文件并发传输。在设计和实现过程中,需要注意服务的可扩展性、安全性以及性能优化,...

    netty技术文档,socket技术 多线程

    标题"Netty技术文档,Socket技术,多线程"指出我们要讨论的是Netty框架,它与Socket编程以及多线程技术的结合。Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端...

    java socket多线程文件传输实例项目

    Java Socket多线程文件传输实例项目是一个典型的网络编程应用场景,主要涉及了Socket编程、多线程处理以及文件I/O操作等关键知识点。在这个项目中,开发者利用Java的Socket API实现了一个能够支持多个客户端同时进行...

    VS2017实现Tcp socket多线程通信(C++)

    多线程技术则允许我们在一个应用程序中同时执行多个任务,提升效率和响应速度。以下内容将围绕标题和描述中的关键知识点展开: 1. **TCP Socket基础**:TCP套接字是网络通信的基本组件,它提供了一种在不同计算机...

    多线程socket文件传输_支持断点续传_收发消息_点对多点

    在多线程Socket文件传输中,通常会创建一个主线程负责管理连接和调度,而其他线程则分别处理文件的读写。这种方式允许并发处理多个文件传输,提高了系统的并行处理能力。对于断点续传功能,需要在客户端和服务器之间...

    socket 一个服务器对应多个客户端使用多线程

    这个程序可能包含了上述步骤的代码实现,通过分析和学习这个示例,开发者可以更好地理解和掌握多线程Socket编程。 总的来说,使用Socket和多线程技术,我们可以构建出能够高效处理多个客户端请求的服务器。这种模型...

    C# socket 多线程多管道可断点传送大文件(附单线程单管道传送)

    本文将深入探讨C#语言中使用Socket进行多线程多管道可断点传送大文件的技术细节。Socket是网络通信的基础,它提供了进程间的通信能力,使得数据可以在不同机器间传输。 首先,我们来理解"多线程"的概念。在C#中,多...

    delphi多线程socket编程介绍

    ### Delphi多线程Socket编程介绍 随着分布式系统的广泛应用,多任务并发技术变得越来越重要。在当前基于多线程的操作系统环境下,开发并发多任务程序已成为软件开发领域的一个热点话题。Delphi作为一种强大的开发...

    异步和多线程socket通讯

    本文将深入探讨"异步和多线程socket通讯"这一主题,基于提供的描述和标签,我们将讨论如何利用多线程和异步机制来提升socket通信的效率和响应性。 首先,Socket是一种在应用程序与网络服务之间建立连接的接口,它...

    JAVA写的多线程socket通信程序源码

    在Java编程领域,多线程Socket通信是一种常见且重要的网络编程技术。Socket是TCP/IP协议栈中的一个关键组件,用于在网络中实现进程间的通信。在这个名为"JAVA写的多线程socket通信程序源码"的项目中,我们可以看到...

    C# socket多线程编程

    【C# Socket 多线程编程】在C#中,Socket编程是实现网络通信的关键,特别是在多线程环境中,能够高效地处理并发连接和数据传输。Socket是TCP/IP协议的基础,它代表了通信的两端点,允许不同主机或同一主机内的进程...

    C++ 实现多线程文件传输的设计与实现

    在C++编程中,多线程技术是一种提升程序性能的有效手段,特别是在文件传输场景中,通过并发执行多个任务,可以显著提高数据传输速度。本文将深入探讨如何利用C++实现多线程文件传输的设计与实现。 一、多线程基础 ...

    基于Java+socket实现多线程聊天室-控制台版.rar

    在本项目"基于Java+socket实现多线程聊天室-控制台版"中,开发者创建了一个简单的、基于命令行界面的多人聊天应用。这个应用利用了Java编程语言以及Socket网络编程技术来实现实时的通信功能。以下是关于这个项目的...

    VC_Socket_多线程文件传输

    《VC_Socket_多线程文件传输》是一个基于C++实现的项目,它演示了如何在Windows环境下使用Visual Studio 2005进行多线程的文件上传与下载功能。这个项目的核心技术主要包括Socket编程、多线程处理以及文件操作,这些...

    基于TCP/IP的Socket多线程通信(服务器和客户端)

    9. **代码示例**:多线程通信的代码通常包含Socket的创建、绑定、监听、连接、读写以及线程的创建和管理。具体实现可以参考提供的“多线程通信完成品”文件。 总的来说,基于TCP/IP的Socket多线程通信是实现高并发...

Global site tag (gtag.js) - Google Analytics