Page 1 of 1

Threads dont work.

Posted: 19 Jul 2011, 03:55
by Anatoli
Hi everyone,

Recently I ran into one very confusing problem.

Im writing a game which is using smartfoxserver, and for some reason the run() method from Runnable class interface does not invoke. It does not show any errors or anything, it just does not run.

The interesting thing is that when I copy the code from my files that extend smartfox's classes, which I use for my server extension, and when I put that code in simple java files just for test, everything works.

The files that are involved in the problem:

[code]//MyExt.java

package com.a51integrated.sfs2x;

import com.smartfoxserver.v2.extensions.SFSExtension;

public class MyExt extends SFSExtension {

@Override
public void init() {

this.addRequestHandler("game", GameHandler.class);
this.addRequestHandler("fire", FireHandler.class);

}

}



//GameHadnler.java

package com.a51integrated.sfs2x;

import com.smartfoxserver.v2.entities.User;
import com.smartfoxserver.v2.entities.data.ISFSObject;
import com.smartfoxserver.v2.entities.data.SFSObject;
import com.smartfoxserver.v2.extensions.BaseClientRequestHandler;
import java.util.Random;


public class GameHandler extends BaseClientRequestHandler {

static int maxPlayers = 40;
static int numT = 0;
static User[] users = new User[maxPlayers];

@Override
public void handleClientRequest(User player, ISFSObject params) {
//bunch of code here
}
}




//FireHandler.java

package com.a51integrated.sfs2x;

import com.smartfoxserver.v2.entities.User;
import com.smartfoxserver.v2.entities.data.ISFSObject;
import com.smartfoxserver.v2.entities.data.SFSObject;
import java.lang.*;

public class FireHandler extends GameHandler {

@Override
public void handleClientRequest(User player, ISFSObject params) {

ISFSObject rtn = new SFSObject();
MyExt parentEx = (MyExt) getParentExtension();

//bunch of my code here

// Create the object with the run() method
Runnable fire = new ThreadHandler();
for(int k = 0; k < numT; k++){
parentEx.send("FIRE_CREATED", rtn, users[k]);
}

// Create the thread supplying it with the runnable object
Thread bulletThread = new Thread(fire);
for(int k = 0; k < numT; k++){
parentEx.send("THREAD_CREATED", rtn, users[k]);
}

// Start the thread
bulletThread.start();
for(int k = 0; k < numT; k++){
parentEx.send("THREAD_END", rtn, users[k]);
}
}
}




//ThreadHandler.java

package com.a51integrated.sfs2x;

import com.smartfoxserver.v2.entities.data.ISFSObject;
import com.smartfoxserver.v2.entities.data.SFSObject;

public class ThreadHandler extends GameHandler implements Runnable{

@Override
public void run() {

MyExt parentEx = (MyExt) getParentExtension();
ISFSObject rtn = new SFSObject();

for(int k = 0; k < numT; k++){
parentEx.send("THREAD_STARTED", rtn, users[k]);
}
//other code here which still doesn't run
}
}
[/code]


So can anyone tell me why method run() doesn't invoke and nothing happens after the line: bulletThread.start(); ???

Thanks in advance.

Posted: 19 Jul 2011, 05:10
by rav
for what do you need a thread if it doesn't have a cycle?
Did you try to debug?

Posted: 20 Jul 2011, 01:12
by Anatoli
OK, I finally figured out what was the problem. :D

I had a null pointer in MyExt parentEx in ThreadHandler class.
I just had to pass it as a parameter to my thread, and that was it.