Has the test failed? That depends on the expected use of the app in Production.
If 20 threads is acceptable, then you have probably proved the app is performant. If the expected production load is greater that 50, then it isn't ready.
Firstly, you need to know what the expected load will be. Once you have that, you have something to benchmark against.
You say you get a 200 for 20-30 threads, but what I would do is time how long it takes to responsd for a single threaded call. You should in your java app be able to find some way to record how long every call takes.
Then, as you ramp up load, by running several tests you can see how the response time degrades and at what point the app fails.
Regarding the server, yes you should monitor server resources such as CPU and memory usage.
If the server is unix or Linux, then I'd suggest installing NMon. This is a fab application. This app will continually monitor server resources whilst a test is running. You can define how frequently to check resources, e.g. Every 10 seconds for a 30 minute period. Once your test has finished you can pull the file off the server. There is a spreadsheet you can download which will read an nmon result file and give you a nicely formatted output.
When gearing up a for a test, I would have nmon running before, during and after the test. That way you can see the point the server is putting under strain. E.g. For a 30 minute test, I would have nmon running for 40 minutes, which is five mins before and five mins after.
So, to sum up, my approach would be to run several tests... one thread, ten, twenty, thirty, forty and fifty. Each test to run for 30 minutes, with Nmon to run for forty minutes. Then you can analyse the server resources and from the test harness see how load affects the response times.