A. java在单独的线程里面不能创建文件吗
Java中不同的线程是可以同时操作一个文件的,只不过有时候因为进程执行的快慢,会出现数据读取不同步的问题,例子如下:
Public class Readfile implements Runnable{ public void run(){ FileInputStream inputStream = new FileInputStream(file);//读数据 byte[] buffer = new byte[1024]; int size; while ((size = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, size);//写数据 } inputStream.close();// outputStream.close(); } public satatic void main(String args []) throws InterruptedException{ Readfile rf = new Readfile(); Thread t1 = new Thread(rf);//开启一个线程 Thread t2 = new Thread(rf);//开启第二个线程 t1.start(); t2.start(); }}
B. 在进程中是不是还可以创建子进程
linux不是很清楚,就知道能创建线程,也能创建进程,进程间的关系不清楚
win下是这样的
可以创建线程,也可以创建其他的进程。但是创建的其他进程不属于创建它的进程。但是创建他的进程可以控制他创建的进程。好像权限和优先级也可以继承
C. 一个进程最多可以创建多少个线程
1,在平台32位系统,系统占用2GB地址空间,用户方式2GB。如果使用VS,链接程序开关/SACK 或者/F可以设置线程堆栈大小,默认分配一个线程的堆栈大小是1MB,当CreateThread参数的StackSize大小与链接程序设置的不一致时,采用的方法是谁大用谁的,所以用4KB修改当然不会有改变!理论上最大线程数=2GB/1MB=2048。
实际上这个用户方式的2GB并不会全部用作线程堆栈。首先程序的代码和数据、进程环境块、线程环境块、空指针区域等等也需要占用一定的地址空间;再者2GB只是虚拟内存,如果非分页内存被用完,就无法再创建线程,这个与特定机器有关,所以不同机器上做最大线程数测试得到的数字可能不一样。
2,操作系统给一个系统进程提供的空间是2GB ,而一个线程堆栈的空间默认在启动的时候是1MB 那么启动完2000后,基本上就有2GB了,你可以减小默认堆栈的大小。
3,默认情况下,一个线程的栈要预留1M的内存空间而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程
但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。
如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。
在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?
这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。
4,默认每线程1MB堆栈的话,只能开2048线程(如果你的其它系统资源足够的话)。要想开更多线程,只能修改每个线程的堆栈,但实际中是不推荐这样做的,因为如果你的线程因为一些工作因为线程堆栈不够的话,会导致整个进程崩溃.修改堆栈的方法好像只在XP或以上系统有效,windows 2000中不支持。
D. 异步任务类只能在主线程中创建吗
刚刚接触异步socket,想问一下使用socket异步还用单独开启线程吗?异步的socket不是每创建一个连接就会自己创建一个线程吗?异步socket做服务器端!请大侠们给讲讲思路
异步和多线程可以说没有必然的联系,只能说异步可以通过多线程实现而已
要理解这些东西,你得具备很多相关的知识,操作系统原理,编译原理等
简单地来说,计算机或者说CPU执行你的代码都是顺序执行的,当前的语句没有执行完,不会执行后面的语句的,这是永远不变的规则!
但是这样的机制会使整个执行效率很低,因为CPU总是要等待当前的语句执行完毕了才会执行后面的代码,而计算机在绝多数的时候都是处于等待用户的输入,等待磁盘文件的读取完成,等待网络数据的传输完成中,所以为了提高整个系统的运行效率,提高CPU的执行效率,计算机系统引入了异步的机制。
异步机制,简单地说就是CPU不会傻傻地处于等待状态,它会先干别的事情,当它需要的东西已经准备完毕后(大多数的情况都是等待外部的输入数据准备完毕,也有些是复杂的计算完毕),硬件系统给CPU一个中断,告诉有了新的数据了,你现在可以去处理了。
这就是最基本的异步原理,而现代操作操作系统对硬件系统做了良好的封装,把很多底层机制屏蔽了,为程序的开发者提供了事件和多线程的概念,让程序的开发者可以更好地利用异步机制。
再说说多线程吧。多线程是计算机引入了操作系统之后才有的概念,至于为什么计算机要引入操作系统,在此就不叙述了,自行了解。多线程的实现有两个方法,一个就是增加CPU的核数和个数,这是最直接的方法,还有一种是采用CPU轮询的方式,每个进程都执行一段时间,又去执行另一个进程的指令,由于切换的速度非常的快,给人的感觉就是同时执行的。
说了这么多,你可能很失望,因为没有代码,没有举例。但我想说的是,用代码无法说明这个问题,不同的操作系统,不同的编程语言,不同的编程框架,对异步和多线程的定义和处理是不一样的,但原理就是这样的。
我们写代码无非就是写一堆的指令去要求CPU执行,同步的方式就是这样的:
我:hi,CPU,我要你做一件事情,而且必须立刻马上就做,因为我正在等着你。
CPU:那你就等着吧,我现在去做。
异步的方式是这样的:
我:hi,CPU,我要你做一件事情,但是不是立刻就做,你可以交给下面的人去做,或者找一个帮手来,我们继续做后面的事情.
CPU:好的,我现在通知硬件去做,等有结果了我通过事件告诉你
或者
CPU:好的,我让另一个核心来做这件事情,我们继续(其实多线程是操作系统实现的,我只是这么举个例子而已)
E. 为什么在同一进程中创建不同线程,但线程各自的变量
Handler对象在主线程中创建,主线程中的消息队列由Handler对象来管理。
由于在同一进程中的的线程共享内存,所以子线程可以获取到主线程中的handler对象。
获取到handler,通过handle可以把Message插入到主线程消息队列中。
主线程消息队列依次把队列中的Message对象交由主线程处理。
F. 进程中同时可以有多个线程在执行,为了使他们能够同
定义:
DWORD WINAPI ThreadProc(LPVOIDlpParam);//线程名称ThreadProc可以是任意的
创建新线程的函数是CreateThread,由这个函数创建的线程将在调用者的虚拟地址空间内执行,函数的用法如下:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpsa,//线程的安全属性
DWORD dwStackSize,//指定线程堆栈的大小
LPTHREAD_START_ROUTINE lpStartAddress,//线程函数的起始地址(执行线程的函数)
LPVOIDlpParameter,//传给线程函数的参数
DWORD dwCreationFlags,//指定创建线程后是否立即启动
DWORD* pdwThreadId //取得内核给新生成的线程分配的线程ID号
);
此函数执行成功后,将返回新建线程的线程句柄。pfnThreadProc新建线程将从此地址开始执行,知道return语句返回,线程运行结束,把控制权交给操作系统。
G. 请问能够实现在UNIX下,一个进程下创建两个线程的问题
我刚刚写了个LINUX下多线程的程序,满足你上面的要求,请参考:
在客户端创建3个线程A B C,A线程随机产生一个整数,B线程随机产生一个大写字母,C线程随机产生一个小写字母。客户端有3个线程ABC,服务端创建一个线程来接收,接收的内容放在队列里。在红旗LINUX下。
H. linux怎样在进程中创建线程
方法一:PS
在ps命令中,“-T”选项可以开启线程查看。下面的命令列出了由进程号为<pid>的进程创回建的所有答线程。
$ ps -T -p <pid>
“SID”栏表示线程ID,而“CMD”栏则显示了线程名称。
方法二: Top
top命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。
$ top -H
I. linux 线程里面创建线程吗
1、windows里的进程/线程是继承自OS/2的。在windows里,"进程"是指一个程序,而"线程"是一个"进程"里的一个执行"线索"。从核心上讲,windows的多进程与Linux并无多大的区别,在windows里的线程才相当于Linux的进程,是一个实际正在执行的代码。但是,windows里同一个进程里各个线程之间是共享数据段的。这才是与Linux的进程最大的不同。2、在windows下,使用CreateThread函数创建线程,与Linux下创建进程同,windows线程不是从创建处开始运行的,而是由CreateThread指定一个函数,线程就从那个函数处开始运行。此程序同前面的UNIX程序一样,由两个线程各打印1000条信息。threadID是子线程的线程号,另外,全局变量g是子线程与父线程共享的,这就是与Linux最大的不同之处。大家可以看出,windows的进程/线程要比Linux复杂,在Linux要实现类似windows的线程并不难,只要fork以后,让子进程调用ThreadProc函数,并且为全局变量开设共享数据区就行了,但在windows下就无法实现类似fork的功能了。所以现在windows下的C语言编译器所提供的库函数虽然已经能兼容大多数Linux/UNIX的库函数,但却仍无法实现fork。3、对于多任务系统,共享数据区是必要的,但也是一个容易引起混乱的问题,windows下,一个程序员很容易忘记线程之间的数据是共享的这一情况,一个线程修改过一个变量后,另一个线程却又修改了它,结果引起程序出问题。但在Linux下,由于变量本来并不共享,而由程序员来显式地指定要共享的数据,使程序变得更清晰与安全。
J. 一个进程可以创建多少个线程
一个进程可来以开启的线程受可用内源存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个。一个解决办法是创建线程时减少线程栈的大小或是使用64位的系统。64位系统应该可以忽略这个问题了。当然受cpu及磁盘速度及物理内存的限制。不用到达上限值,你的机器应该已经是慢如牛车了。